{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "895f27db",
   "metadata": {},
   "source": [
    "# 1 时间序列数据预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14a78ae4",
   "metadata": {},
   "source": [
    "## 1.1 数据集引入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3ced415a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>GS10</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DATE</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-02-01</th>\n",
       "      <td>2.86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-01</th>\n",
       "      <td>2.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-04-01</th>\n",
       "      <td>2.87</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-05-01</th>\n",
       "      <td>2.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-06-01</th>\n",
       "      <td>2.91</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            GS10\n",
       "DATE            \n",
       "2018-02-01  2.86\n",
       "2018-03-01  2.84\n",
       "2018-04-01  2.87\n",
       "2018-05-01  2.98\n",
       "2018-06-01  2.91"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas_datareader as pdr\n",
    "gs10 = pdr.get_data_fred('GS10')\n",
    "gs10.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cae01416",
   "metadata": {},
   "source": [
    "## 1.2 绘制数据图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "773eae8a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD4CAYAAAD4k815AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8+yak3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvRElEQVR4nO3deXzU1bn48c8zmewrWUhCNtYAYYfIKrgAFmwLbvVK677QxbYutV69tz+r9na73dXetlStYtWq1SoqiKgILmxhJ4QlkEAgCdl3sk3O748MNMQsk2SSWfK8X6+8nMyc+X6fI/DMmfM93+eIMQallFLew+LqAJRSSjmXJnallPIymtiVUsrLaGJXSikvo4ldKaW8jNVVJ46OjjbDhw931emVUsoj7dy5s8QYE9NVG5cl9uHDh5ORkeGq0yullEcSkRPdtdGpGKWU8jKa2JVSystoYldKKS+jiV0ppbyMw4ldRHxEZLeIvNPBa/4i8oqIZIvINhEZ7tQolVJKOawnI/Z7gKxOXrsDKDfGjAZ+B/yyr4EppZTqHYcSu4gkAl8Gnu6kyXLgefvjfwILRUT6Hp5SSqmecnTE/nvgQaClk9cTgDwAY0wzUAlEtW8kIitFJENEMoqLi3serVJKuaGSmgbW7M3HXcqgd5vYReQrQJExZmdfT2aMWWWMSTfGpMfEdHnjlFJKeYw/fXyM77+8mx+vyXSL5O7IiH0esExEcoF/AJeLyN/btTkNJAGIiBUIB0qdGKdSSrmtA6cr8bNaWL3lBD968wAtLa5N7t2WFDDGPAw8DCAilwIPGGNubNdsDXALsAW4DvjIuMPHllJK9TNjDAcLqvjajERCA3z586ZjtBj46VUTsVhcc6mx17ViRORxIMMYswZ4BnhBRLKBMuAGJ8WnlFJuLa/sLNX1zUwYFs6KmUn4WOCPG49hjOFnV09ySXLvUWI3xnwMfGx//Eib5+uBrzkzMKWU8gSZ+ZUATBgWhojwwBVjsYjw5EfZ2FoMv7x28oAnd5dVd1RKKW+QmV+Fj0UYGxcKgIhw/+JURIQnPjzKrJFRXDcjcUBj0pICSinVB5n5lYyOCSHA1+f8cyLCfYvGkDgkkHf35Q94TJrYlVKqDzLzq5gwLOwLz4sISyfG8Wl2CZVnmwY0Jk3sSinVS8XVDRRVN5DWQWIHWDIxniab4aNDZwY0Lk3sSinVS/++cBre4evTkiKICwtg7f7CgQxLE7tSSvVWZn4VQKcjdotFWDIxjs1HiqltaB6wuDSxK6VULx3MryIpMpDwQN9O2yydGEdDcwsbDxcNWFya2JVSqpcy8yuZEN/xNMw56cMjiQ7xY90ATsdoYldKqV6orm8it7SuwxUxbflYhCsmxLHxcBFnG20DEpsmdqWU6oWsgmoAJiR0ndgBrpwYT12jjU1HBqZcuSZ2pZTqhe5WxLQ1a2QkEUG+vHegoL/DAjSxK6VUr2TmVxEd4sfQUP9u2/r6WLgiLZYPs4poaO7/6RhN7Eop1QuZ+VWkDQvH0V1Al06Mp7qhmc+yS/o5Mk3sSinVYw3NNo6eqe72wmlbc0dHERpgHZDVMZrYlVKqh46eqaG5xfQosftbfVg0PpYNWWdosnW2fbRzaGJXSqke6smF07aWTIyjoq6Jrcf7d+dQTexKKdVDmflVhPhbSYkM6tH7LkmNIcjPhw0H+7comG60oZRSPZSZX8X4+NAe74wU4OvDKyvnMCY2pJ8ia6UjdqWU6gFbiyGroKrH0zDnTEoMv2BTjv6giV0ppXogt7SWukZbpxUd3UG3iV1EAkRku4jsFZFMEXmsgza3ikixiOyx/9zZP+EqpZRrnS/VG+++id2ROfYG4HJjTI2I+AKfisg6Y8zWdu1eMcZ81/khKqWU+8jMr8TXR0iNDXV1KJ3qNrEbYwxQY//V1/5j+jMopZRyV0cKqxkVE4Kf1X1nsh2KTER8RGQPUARsMMZs66DZtSKyT0T+KSJJnRxnpYhkiEhGcfHAVDlTSilnyimpZVRM/65q6SuHErsxxmaMmQokAjNFZGK7Jm8Dw40xk4ENwPOdHGeVMSbdGJMeExPTh7CVUmrgNdlayCs/y4joYFeH0qUefZcwxlQAG4El7Z4vNcY02H99GpjhlOiUUsqN5JXVYWsxnp/YRSRGRCLsjwOBxcChdm3i2/y6DMhyYoxKKeUWckpqARju5ondkVUx8cDzIuJD6wfBq8aYd0TkcSDDGLMG+L6ILAOagTLg1v4KWCmlXOVcYh/p6YndGLMPmNbB84+0efww8LBzQ1NKKfeSU1JLeKAvQ4L9XB1Kl9x3vY5SSrmZnJJat59fB03sSinlsFxN7Eop5T3ONtrIr6zXxK6UUt7iRJlnrIgBTexKKeWQnGLPWBEDmtiVUsohOaU6YldKKa+SU1xLTKg/If7uv/GcJnallHJAbqlnrIgBTexKKeWQnJJaRkRpYldKKa9QVd9ESU0jI2I0sSullFfIPVf8S0fsSinlHc4X/9IRu1JKeYecklpEIDkyyNWhOEQTu1JKdSOnpJZh4YEE+Pq4OhSHaGLvJ58eLeFHb+5n4+EiGptbXB2OUsrOGEOzrWf/Jj2l+Nc57r/S3gPVNDRz/6t7KKpu4O9bTxIWYOWKCXFcOSmOeaOj8bd6xqe+Ut7oiQ+zeTUjj40PXIqftfuxrTGG4yW1XDU1YQCicw5N7P3gyY+OUlTdwKvfnEPV2SbW7i9g/YFC/rnzFJHBfrz+7bke9emvlLdotrXw920nKK5uYOPhIr40Ia7b95TVNlJd3+wRpQTO0cTuZMeLa3j20xy+NiORmSMiAViUFktDs43NR0r45gsZ/Gv3ae5fnOriSJUafDYdKaa4ugGLwL92nXYosXvKdnht6Ry7k/3knYMEWH14cMm4C573t/qwOC2WGSlD+ODgGRdFp9Tg9lrGKaKC/bhpdgofHjpDRV1jt+85l9g96Vu2JnYn+jDrDBsPF3PPojHEhPp32GbR+FgOFlSRX3F2gKNTanArq23kw0NnuGpaAtdflESTzfD2voJu35dTUovVIiQOCRyAKJ1DE7uTNDTbePydg4yKCebmOcM7bbcoLRZo/RBQSg2cN3efpslm+Fp6ImnxYYyLC+WNXae6fV9uaS3JkUFYfTwnXXYbqYgEiMh2EdkrIpki8lgHbfxF5BURyRaRbSIyvF+idWPPfJrDidI6Hl02ocsr7aNiQhgRHcyGrKIBjE4p9drOU0xKCGdcXBgiwjXTE9h9soLjxTVdvu94ca1HXTgFx0bsDcDlxpgpwFRgiYjMbtfmDqDcGDMa+B3wS6dG6eYKK+t56qNsrkiLZf6YmG7bLxo/lK3HSqlpaB6A6JRSB05XklVQxdfSE88/t3xqQutF1N2nO31fS4vxqHK953Sb2E2rcx9pvvYf067ZcuB5++N/AgtFRJwWpRszxvDomkyaWww/+nKaQ+9ZND6WRlsLnxwp7ufolFIA/9x5Cj8fC8umDDv/XGxYABePieFfu0/T0tI+pbU6U11PfVOLV47YEREfEdkDFAEbjDHb2jVJAPIAjDHNQCUQ1cFxVopIhohkFBcPfFKztRh+vf4wG5y4KuWPG7N5L7OQHyxOJTnKsToSM1KGEB7oywadZ1eq3zU023hzz2kWT4glIsjvgteunZ7AqfKz7Mgt6/C9nrTPaVsOJXZjjM0YMxVIBGaKyMTenMwYs8oYk26MSY+J6X7Kwtl+tf4wT23M5q7VGfxsbRZNPbytuL31mYX8+v0jXDV1GCsXjHT4fVYfC5ePG8rGQ0XYOhkpKKWc46OsIirqmvjajMQvvHZFWhzBfj68savj6RhP2ue0rR5d5jXGVAAbgSXtXjoNJAGIiBUIB0qdEJ/TvLMvnz9vOsYNFyVx0+wUVm0+zjf+uo2iqvpeHS+roIr7XtnDlKQIfnHtZHo687RofCzldU3sOlneq/MrpRzz2s5TxIUFdHj9K9DPh6WT4nl3fwH1TbYvvJ5TXIu/1UJ8WMBAhOo0jqyKiRGRCPvjQGAxcKhdszXALfbH1wEfGWPcZih6qLCKH762jxkpQ3h8+UR+ctVE/nDDVPafruTKJz5l6/GefQaV1DRw5/MZhAZY+etNM3pV8W1BajS+PqI3KynVj4qq6vn4cBHXTE/Ax9Lx4Oua6QnUNDTzfgf/Fs9dOLV08l535ciIPR7YKCL7gB20zrG/IyKPi8gye5tngCgRyQbuBx7qn3B7rqKukZWrdxIaYOVP35h+fini8qkJvPXdeYQFWvn6X7fy03cP8ll2SbcrVRqbW/jO33dRUtPAX29OZ2gvP8lDA3yZPTJK59mV6kdv7D5Ni4HrOpiGOWf2iCiGhQd0uKb9eEmtx+ya1Fa3tWKMMfuAaR08/0ibx/XA15wbWt/ZWgzfe3k3BZVn+cfKOV9Iwqmxoaz57sX81xv7efrTHP76SQ4WgXFxYcxIGcL4+DCsPhd+Um86Usz23DKeXDGNyYkRfYpv0fhYfrwmk+PFNYyMCenTsZRSF2qytfCP7SdJTxnS5b8vi0W4enoCf9x4jNQfrbvgtcbmFofqybgbry0CZozhf9cf4pOjJfz8mknMSBnSYbsQfytPrJjG/1w9kT0nK8g4Uc6uE+W8sesUtY1fnHMD+P7CMXy1zbKp3lo4fig/XpPJh1lFmtiVcrIXtpwgt7SO/3ZgGfLt80bgI0Kj7cIZZB8LrJiZ3F8h9huPS+yHCqt4+pMcZo6IZPaIKJIiA89fuGxpMezOK2ft/kLW7S8gv7Ker89KdugPJizAlwWpMSxIbb3AYmsxFFbV0/5SgZ+PpdfTL+0lDgliXFwoG7LOcFcPVtUopbpWUtPA7z44wiWpMSwaP7Tb9lEh/tx/xdgBiGxgeFxiP1laxwdZZ/jnztb5sLiwAGaOiCQiyJf3M89QWFWPn4+FBanRPPClsRfckNATPhYhIaL/i/4sTovljxuzKa9tZEiwX/dvUEp161fvHeZso41HvprW4xVr3sDjEvsVE+JYND6W7OIath0vZVtOGVuOl1J5tolLUmN4aNI4Lh8/lLAAX1eH6pCF42N58qNs3t1fwI2zU1wdjlIeb29eBa/uzOOu+SMZNUinOD0usUPrxY7U2FBSY0O5ac7w1j0MWwy+HlR97ZzJCeHMSBnCz9dmMXdUlM61K9UHLS2GR9/OJCrYn+9dPtrV4biM52XCDoiIRyZ1aP2QenLFNPysFr7z4q4Ob5JQSjnmX7tPs/tkBQ8tHUeoh3xr7w+emQ29zLCIQH73H1M5VFjNj9/KdHU4Snmk6vomfvHeIaYmRXDNNM/ZeLo/aGJ3E5eOHcp3LxvNKxl55y8MK6Uc99RH2RRXN/DYsgked6eos2lidyP3LhrD7JGR/OjN/Rw5U+3qcJTyGNX1TTz7WQ7XzUhkSlKEq8NxOU3sbsTqY+GJG6YR4u/Ld17cRa1uxKGUQ44X19JkM1xh33pysNPE7maGhgXwxA1TOVZcwy3PbufN3aeprm9ydVhKubWcEnvd9BjPq+vSHzxyuaO3mzs6mp9dPYnff3CEe1/Zc/6GqysnxbNwfCzhgYP3ar9SHckpqcUikBTp2GY33k4Tu5taMTOZ/0hPYndeOe/uK2TdgQI+yCoi2M+HV745h4kJ4a4OUSm3kVNSS8KQQPytPS+h7Y10KsaNWSzCjJRIHvlqGp/95+W8/u25hAX6cvdLu3R6Rqk2cjy0vG5/0cTuIVqT/BCeWDGNU+VnefiN/V8oUKbUYGSMIbek1uP2Je1Pmtg9zEXDI7l/cSrv7Cvgpe0nXR2OUi5XUtNIdUMzIzSxn6eJ3QN9+5JRLEiN4bG3D3Iwv8rV4SjlUrkeuuF0f9LE7oEsFuG3108hwj7f3t12fkp5s5xi+1LHaC2gd44mdg8VHeLPEyumcaK0lvtf2UNRdb2rQ1LKJXJKa/H1EYZFOGcDHG+gid2DzR4ZxUNLx7Eh6wwX/2IjP3h1L5n5la4OS6kBlVNcS3JkEFYPrfDaH7r9PyEiSSKyUUQOikimiNzTQZtLRaRSRPbYfx7p6FjK+VYuGMVHP7iUG2YmsXZ/AV9+4lNuWLWFDw6e0VUzalDILa3VC6ftOPIR1wz8wBiTBswG7haRjnaH/cQYM9X+87hTo1RdGhEdzOPLJ7L14YU8vHQcJ0vruHN1Bs98muPq0JTqVy0thpwSTeztdZvYjTEFxphd9sfVQBYwuIsdu6nwIF++eckoNj94GYvGx/K/6w+TXaRVIpX3Kqyqp6G5RVfEtNOjSSkRGQ5MA7Z18PIcEdkrIutEZEIn718pIhkiklFcXNzzaJVDrD4WfnbNRIL8fPjBq3tptrW4OiSl+sW54l86Yr+Qw4ldREKA14F7jTHtF0/vAlKMMVOAJ4E3OzqGMWaVMSbdGJMeExPTy5CVI4aGBvA/V01k76lK/rL5uKvDUapfHNfE3iGHEruI+NKa1F80xrzR/nVjTJUxpsb+eC3gKyLRTo1U9dhXJg/jy5Pj+f0HR/RGJuWVcktqCfT1ITZUlzq25ciqGAGeAbKMMb/tpE2cvR0iMtN+3FJnBqp65yfLJxIe6MsPXttLY7NOySjvklNSy/Do4EG/FV57jozY5wE3AZe3Wc54pYh8S0S+ZW9zHXBARPYCTwA3GF1r5xYig/34+TWTySqo4qmPjro6HKWcKreklhHRWoO9vW7rsRtjPgW6/Dg0xjwFPOWsoJRzLU6L5ZrpCfzx42MsTotjUqLWcleer9nWwsmyOpZOinN1KG5Hb9UaJH781QkE+fnwwtZcV4eilFOcKj9Lc4vROuwd0MQ+SIQH+jJ/TDSbj5ToHanKK+g+p53TxD6IzB8TQ2FVPdlFNa4ORak+O5fYdcT+RZrYB5H5Y1pXoG46ojeHKc+XU1JLWICVyGA/V4fidjSxDyKJQ4IYGRPMJ0dLXB2KUn12rviXfaW1akMT+yCzYEwM23JKqW+yuToUpfrkeLEW/+qMJvZBZkFqNPVNLWTklrs6FKV6rb7JRn7lWS3+1QlN7IPM7JFR+PoIm4/qPLvyXCfL6jBGa8R0RhP7IBPkZyU9JZLNegFVebDjus9plzSxD0ILUmM4VFhNUZXuk6o8U26pfamjlhPokCb2QWhBauuyR10dozxVTnEt0SH+hAb4ujoUt6SJfRAaHxdGdIifzrMrj5VTqsW/uqKJfRCyWIT5Y2L49GgJLS1aXkB5Ht3ntGua2Aep+WOiKa1t5GCBbsChPEtNQzPF1Q261LELmtgHqYvt5QV0OkZ5mtxzxb80sXdKE/sgNTQ0gPHxYbrsUXmcc/uc6oi9c5rYB7EFqdHsPFFObUOzq0NRymEbDp4hLMCqc+xd0MQ+iC0YE0OTzbD1uG5PqzxDcXUD7x0o4NoZifhbfVwdjtvSxD6IpQ8fQoCvhY8OFWHT1THKA7yakUeTzfCNWSmuDsWtdbvnqfJe/lYf5o6K5sVtJ3llRx6xYQEMiwggPjyQqUkR3H7xCFeHqNR5thbDS9tOMmdkFKOHaimBrmhiH+T+56qJfHioiIKKsxRU1pNfcZatx0tZszefpZPiiA8PdHWISgGw6UgRpyvO8t9fHu/qUNxet4ldRJKA1UAsYIBVxpg/tGsjwB+AK4E64FZjzC7nh6ucbVhEIDfNvvBr7e6T5Vz9f5+zN69SE7tyG3/fepKhof4sTot1dShuz5E59mbgB8aYNGA2cLeIpLVrsxQYY/9ZCfzJqVGqATU+PgxfH2FPXoWrQ1EKgLyyOjYeLuKGi5Lw9dFLg93p9v+QMabg3OjbGFMNZAEJ7ZotB1abVluBCBGJd3q0akAE+PowPj6MvZrYlZt4aftJBLhhZrKrQ/EIPfroE5HhwDRgW7uXEoC8Nr+f4ovJHxFZKSIZIpJRXKw3xrizKYkR7D9dqatllMs1NNt4dUceC8fHMixCpwYd4XBiF5EQ4HXgXmNMrwqMGGNWGWPSjTHpMTExvTmEGiBTkiKoaWjmeHGNq0NRg9x7BwoprW3kxtm6xNFRDiV2EfGlNam/aIx5o4Mmp4GkNr8n2p9THmpqUjiAzrMrl3tx60lSooKYPzra1aF4jG4Tu33FyzNAljHmt500WwPcLK1mA5XGmAInxqkG2MjoEEL9rew9VeHqUNQgdjC/iu25ZXxjVjIWi7g6HI/hyDr2ecBNwH4R2WN/7r+AZABjzJ+BtbQudcymdbnjbU6PVA0oi0WYnBTO3rxKV4eiBrHfvH+Y0AAr16cndd9YnddtYjfGfAp0+VFpjDHA3c4KSrmHKYkRrNp8nPomGwG+WpdDDawduWV8eKiIB5eMJSLIz9XheBRdEKo6NSUpguYWo5txqAFnjOEX6w4RG+bPbXO1tEVPaWJXnZqaFAHAnpMV/XL8Hbll3Pl8htaEV1/wQVYRO0+Uc8/CVAL99NtiT2mtGNWp2LAA4sICnH4BNa+sjp+vy2Lt/kJE4LPsEl68axbTk4c49TzKM9laDL9af4iR0cFcn57o6nA8ko7YVZemJIU77Q7U6vomfrHuEAt/s4mNh4q5b1Eqm394GUPD/Ln9uR1kF1U75TzKs72x6xRHztTwgyvGYtXyAb2i/9dUl6YkRZBbWkdFXWOfjrP/VCWX/XoTf950jK9MiWfjA5dyz6IxJEUG8cLts7BaLNz8zHbyK846KXLlieqbbPxuwxEmJ4Zz5aQ4V4fjsTSxqy5NTYwAYO+p3i97zCmp5da/bcffauGtu+fx2+unEhcecP715Kggnr/9Iqrrm7nl2e19/hBRnuvvW0+QX1nPfy4ZR+stNKo3NLGrLk1MDEeEXk/HFFXVc9Mz2zDAC3fMZIr9gmx7E4aFs+rmdE6U1nH7czs422jrdczKM1XVN/HUxmzmj4lmnt5l2iea2FWXwgJ8GRUT0qvEXnm2iZuf3U5ZbSPP3XYRI2O63vVmzqgo/nDDVHbnVfBf/9rfy4iVp/rbp7lU1DXxn0vGuToUj6eJXXVralIEe09V0HofmmPqm2zctTqDY8U1/OWmGUy2T+l0Z+mkeG6dO5y39+ZTXqtTMoPJmr2nmTsqiokJ4a4OxeNpYlfdmpIUQUlNI6fKHbuwaWsxfP/l3ezILeM3109l/pieVfK8dnoizS2GdQcKexOu8kDZRTUcK67lSxP0gqkz6Dp21a1/X0CtICky6ILXDuZX8fmxEgoq6ymoPEt+RT2nK85SXN3Ao19NY9mUYT0+34RhYYyMDmbN3tN8fZZurDAYbDh4BkC3vXMSTeyqW2PjQvGzWtibV8FXJrcmamMMz36Wy8/XZtHcYgjwtTAsPJD4iAAuTY1hzqgorpneu5tLRIRlU4fxhw+PUlhZf8EKGuWd1mcWMjkxXDfScBJN7KpbflYLE4aFna/0WF3fxEOv7+fd/QUsTovlp1dNJCbU36nL05ZNGcbvPzjKO/vyuXP+SKcdV7mfM1X17Mmr4IErUl0ditfQOXblkHNb5R3Mr2L5U5/xXmYhDy0dx6qbZjA0LMDpa45HxoQwKSGct/bkO/W4yv2cm4bR+XXn0RG7csjUpAie+zyXZU99ypBgP168cxazR0b16zmXTx3G/7ybxfHimm6XSg522UU1rN1fwMbDRcSE+DMjZQjpw4cwYVi425dcfv/gGUZEBzN6qP4ZO4smduWQGSlDsFqE6SlDeGrFNIaG9f+891cmD+Ona7NYszefexfp1/T2jp6p5t39BazdX8CRM617005JiuDwmWret4+C/XwsTEoM5675I1ky0f1GxFX1TWw5VsLt80bonaZOpIldOSQpMojND17G0FD/ASvMFBcewKwRkazZm889C8foP/w2Pjp0htufy0AELhoeyaNfTWPJxPjzF5qLqxvYdbKcXSfK+fBQEXe/tIunb07nsnFDXRz5hTYeKqLJZrhigq6GcSadY1cOGxYROODV9pZNSeB4cS2Z+brZR1vrD5whIsiXbQ8v5NVvzuHWeSMuWD0UE+rPlybE8fCV43nz7nmMjw/l2y/uZOeJ8n6Lqa6xmS3HSntU6+f9g2eIDvFnWpKWbHYmTezKrS2dGIevj7Bmr15EbWvHiTLSU4Y4NCUW4m/ludtmEhcWwO3P7eDomf4pj/zr9UdY8detTH18A5f/5mMeeG0vL247waHCjj+UG5ptfHyoiMVpsbpRtZNpYldubUiwHwvGxPD23nxaWhwvaeDNSmoaOF5cS/rwSIffEx3iz+rbZ+FntXDzs84vj1zb0MxrGXksSI3hh18ay8joYD46VMR//+sAS37/CY+9nfmFkhSfZ5dS22jTaZh+0G1iF5FnRaRIRA508vqlIlIpInvsP484P0w1mC2bOoyCynp25Ja5OhS3kJHbOp1y0fCeTV8kRwXx/G0zqalv5uZntzu1Fs+be05T3dDM9y8fzd2XjebpWy5i548WsemHl3Lj7GT+9lkuP1936ILk/v7BQkL8rcwd1b+rqwYjR0bszwFLumnziTFmqv3n8b6HpdS/LU6LJdDXh7d0OgaAjNwy/KyWXhXLShsWxl9vSedkWR13rc5wyrcgYwwvbDlBWnwYM1L+/WEjIqREBfOT5RO5aXYKqzYf51frD2OMwdZi2HDwDJeOjcHf6t7LMT1Rt4ndGLMZ0KGScpkgPyuL02JZu7+AJluLq8NxuR0nypmaGNHrhDh7ZBSPLZtAxolyNh/t+0bi23PKOFRYzc1zUjpcuSQiPLZsAitmJvF/Hx/jDx8eZU9eOSU1jVyhNyX1C2fNsc8Rkb0isk5EJnTWSERWikiGiGQUF+vO9MpxC8cPpaKuieyiGleH4lJ1jc1knq7kohF9W0Vy7fREhob68+xnuX2OafXWE4QFWFk+NaHTNhaL8NOrJnHdjER+/8FRfvjaPnx9hEvH9qzyp3KMMxL7LiDFGDMFeBJ4s7OGxphVxph0Y0x6TIz+gSrHjYgOBuBkWZ2LI3GtPXkVNLeYHl047Yif1cLNc1LYfKS4T6tkiqrqWX+gkOvTkwj06/obhMUi/PLayVw9LYHjJbXMHRVNWIBvr8+tOtfnxG6MqTLG1NgfrwV8RUT3tVJOlRJpT+ylgzuxZ+SWIwLTk/u+7vvrs1Lwt1r6NGp/aftJmlsMN85Ocai9j0X41XWT+eGXxvLAFWN7fV7VtT4ndhGJE/vEmojMtB+ztK/HVaqt8CBfwgKsg37EviO3jLGxoYQH9n2kGxnsxzXTE3hj1ynKerFCpsnWwkvbTnJJagzD7d+oHGH1sXD3ZaOZlKg7JfUXR5Y7vgxsAcaKyCkRuUNEviUi37I3uQ44ICJ7gSeAG0xP9lBTykEpUcGcGMSJvdnWwq4T5VzUx2mYtm6fN4KG5hZe2naix+9dn1lIUXUDt8x1bLSuBk63tWKMMSu6ef0p4CmnRaRUJ5IjgzhYMHhLCxwqrKa20UZ6D9evd2VMbCjzx0SzessJVi4YhZ/V8S/xq7ecICkykEtS3av+jNI7T5UHSY4K4lR5HbZBegdqhv0GLWeO2AHuuHgERdUNvLvf8fsEDhVWsT2njBtnpeCj5QDcjiZ25TGSI4NoshkKKp17O7yn2JFbTkJEoNO3j7skNYbRQ0N45tOcL9z235FmWwu/Xn8Yf6uF69OTnBqLcg5N7MpjpNg30h6MK2OMMezILXPqNMw5IsJt84Zz4HQVO3K7rv7YZGvh+//YzQdZRTy4ZBxDgv2cHo/qO03symMk2RP7YLyAmld2lqLqhj6vX+/MNdMSiQjy5ZlPj3fapsnWwvde2s3a/YX86MvjuePiEf0Si+o7TezKYwyLCMRqkUG55HHH+fn1/qlbHujnwzdmJfP+wTM89Po+DhdeeNNSY3MLd7+4i/cyC3nkK2m6wbib0x2UlMfwsQiJQwIH5VRMxokyQgOspA4N7bdzfPvS0ZTXNfH6zlP8Y0ce88dEc/vFI5gzMorvvrSbD7LO8OhX07h1no7U3Z0mduVRkqOCB+mIvZz0lCH9uiFFiL+Vn109iQeuGMvL20/y/Oe53Pa3HYQGWKmub+bx5RO4ec7wfju/ch5N7MqjpEQGsedk/23v5o7KahvJLqrh6mmdF9lypshgP+6+bDR3zR/J2v0FvLIjj+VTh3HDzOQBOb/qO03syqMkRwZRVd9MZV0T4UGDo4DUv3afBmDe6IEtweRntXDVtASuGqAPFOU8evFUeZTkqHMrY2pdHMnAONto408fH2POyCimJkW4OhzlITSxK4+SfG4t+yCZZ//71hOU1DRw3+JUV4eiPIgmduVRziX2E4NgZUxdYzN/3nSMi0dHM3NE/6xfV95JE7vyKMH+VqJD/MgbBCP21VtOUFrbyH2Lx7g6FOVhNLErj5McGeT1I/bahmZWbT7OgtQYZqToaF31jCZ25XGSI4O8fo79+S25lNU2ct8iHa2rntPErjxOclQw+ZVnaWxucXUo/aK6volVm49z6dgYpjlhCzw1+GhiVx4nJTIIY+BUuXeO2p//PJeKuibuW6QrYVTvaGJXHufcWnZvnI6pqm/ir5/ksHDcUKbounXVS5rYlcdJ8eK17E9/kkPl2Sbu1dG66gNN7MrjxIT6E+Br8boqjydL6/jLpmN8eXI8kxLDXR2O8mDdJnYReVZEikTkQCevi4g8ISLZIrJPRKY7P0yl/k1EWpc8etGI3RjDo29nYrUI/+/Laa4OR3k4R0bszwFLunh9KTDG/rMS+FPfw1Kqa8mRQV51k9KGg2f46FAR9y5KJS48wNXhKA/XbWI3xmwGyrposhxYbVptBSJEJN5ZASrVkeTI1rrsjmy+7O7ONtp47O2DpMaGcOu84a4OR3kBZ8yxJwB5bX4/ZX9OqX6THBlIXaON4poGV4fSZ09tPMrpirP8ZPlEfH30spfquwH9WyQiK0UkQ0QyiouLB/LUysukRAUDePx0zLHiGlZtPs410xOYNTLK1eEoL+GMxH4aSGrze6L9uS8wxqwyxqQbY9JjYmKccGo1WJ2vy+7BK2OMMTzy1gECfH14eOl4V4ejvIgzEvsa4Gb76pjZQKUxpsAJx1WqU4lDAhHx7LXs7+wr4LPsUn74pbHEhPq7OhzlRbrdGk9EXgYuBaJF5BTwY8AXwBjzZ2AtcCWQDdQBt/VXsEqd42/1IT4swGPXsq/dX8CP3jzAxIQwvjErxdXhKC/TbWI3xqzo5nUD3O20iJRyUJIHVnmsqGvkx2syeWtPPpMTw3lyxTR8LOLqsJSX0c2slcdKiQpi42HPuQi/8XARD72+j9KaRu5fnMp3Lh2FVVfBqH6giV15rOTIIIqrGzjbaCPQz8fV4XSqodnGo2sO8vL2k4yNDeWZWy5iYoKWDFD9RxO78lhpw8IA2HSkiCUT3fOeuIq6Rla+sJPtOWV885KR3L84FX+r+34IKe+g3wOVx7okdSgJEYE8+1muq0Pp0KnyOq778xb2nKzgiRXTeHjpeE3qakBoYlcey8ci3DI3he05ZWTmV7o6nAscOF3J1f/3OUVV9ay+YybLpgxzdUhqENHErjzaf6QnE+jrw9/caNT+8eEirv/LFvx8LLz+7bnM1jtK1QDTxK48WniQL9fOSGDNnnxK3KBuzLr9BdzxfAbDo4J54ztzGRMb6uqQ1CCkiV15vFvnjqDR1sLL2066NI6sgiruf3UvkxPDefVbc4gN0/K7yjU0sSuPN3poCAtSY3hh6wkam1tcEkNFXSPffGEnoQFW/nLjDEL8dcGZch1N7Mor3DZvOEXVDaw74HiZoqr6Jg4XVvf53LYWw/de3k1B5Vn+dOMMhupIXbmYJnblFS4ZE8PI6GCHlz5+cPAMi36ziaV/2MwnR/t29+qv1h/mk6MlPL58IjNShvTpWEo5gyZ25RUsFuGWucPZm1fBrpPlnbYrr23k3n/s5s7VGUQG+zEqJoTvvby713Xd39mXz583HePrs5JZMTO5t+Er5VSa2JXXuHZGIqH+1k6XPr53oIDFv9vMO/sKuGfhGNZ892KeviWdlhbDXaszqGtsdvhcxhi2HCvlh6/tY0bKEB796gQn9UKpvtMrPMprhPhbuf6iJJ7/PJe1E+OoqGuioPIs+RX15JTUsOtkBROGhbH69pnnyxGkRAXzxIpp3PbcDh785z6eXDENkY6rLRpj2HuqkrX7C1i7v4BT5WeJCwvgT9+Yjp9Vx0jKfYirNgNOT083GRkZLjm38l4nS+u47DcfY2tp/XttEYgNCyA+PIDFaXHcOX9Eh/uK/nFjNr9af5iHl47jm5eMOv98S4thd14F6/YXsO5AIacrzuLrI8wbHc2Vk+L5Uloc4UG+A9Y/pURkpzEmvas2OmJXXiU5Koi37p5HfZON+IhAYkP9HSqN+51LR5GZX8kv3zvEuPgwgv18eHd/Ae8dKKSgsh4/HwsXj4nmvsWpLB4fq8lcuTVN7Mrr9KYkrojwq+umkF1Uwy3PbgfAz2phwZgYHlwyloXjYwkL0GSuPIMmdqXsgv2tPH3zRfxpUzazR0Zx+bihhGoyVx5IE7tSbSRHBfHzaya7Ogyl+kQv5SullJfRxK6UUl7GocQuIktE5LCIZIvIQx28fquIFIvIHvvPnc4PVSmllCO6nWMXER/gj8Bi4BSwQ0TWGGMOtmv6ijHmu/0Qo1JKqR5wZMQ+E8g2xhw3xjQC/wCW929YSimlesuRxJ4A5LX5/ZT9ufauFZF9IvJPEUnq6EAislJEMkQko7i4bxX1lFJKdcxZF0/fBoYbYyYDG4DnO2pkjFlljEk3xqTHxMQ46dRKKaXaciSxnwbajsAT7c+dZ4wpNcac23DyaWCGc8JTSinVU47coLQDGCMiI2hN6DcAX2/bQETijTHntq5ZBmR1d9CdO3eWiMgJB84fDZQ40M4bad8HJ+374ORo31O6a9BtYjfGNIvId4H1gA/wrDEmU0QeBzKMMWuA74vIMqAZKANudeC4Ds3FiEhGd5XMvJX2Xfs+2GjfndN3h0oKGGPWAmvbPfdIm8cPAw87IyCllFJ9o3eeKqWUl/GExL7K1QG4kPZ9cNK+D05O67vLdlBSSinVPzxhxK6UUqoHNLErpZSXGfDELiJJIrJRRA6KSKaI3GN/PlJENojIUft/h9ifHyciW0SkQUQeaHes++zHOCAiL4tIwED3pyec3Pd77P3OFJF7XdCdHulF379hL1GxX0Q+F5EpbY7VZbVRd+Pkvj8rIkUicsBV/ekJZ/W9s+O4Myf2PUBEtovIXvtxHuv25MaYAf0B4oHp9sehwBEgDfhf4CH78w8Bv7Q/HgpcBPwUeKDNcRKAHCDQ/vurwK0D3R8X9X0icAAIonXJ6gfAaFf3z8l9nwsMsT9eCmyzP/YBjgEjAT9gL5Dm6v4NRN/tvy8ApgMHXN2vAf5z7/A4ru7fAPVdgBD7Y19gGzC7y3O7QefforUk8GEgvs3/kMPt2j3KFxN7HhBpT27vAFe4uj8D1PevAc+0+f3/AQ+6uj/90Xf780OA0/bHc4D1bV57GHjY1f0ZiL63eW64pyR2Z/e9/XFc3Z+B7jutg7ldwKyuzuXSOXYRGQ5Mo/UTKNb8uyxBIRDb1XuNMaeBXwMngQKg0hjzfv9F61x96Tuto/X5IhIlIkHAlVxYz8et9aLvdwDr7I8drTbqlvrYd4/mrL63O45H6GvfRcRHRPYARcAGY0yXfXfZZtYiEgK8DtxrjKkSkfOvGWOMiHS5DtM+L7UcGAFUAK+JyI3GmL/3X9TO0de+G2OyROSXwPtALbAHsPVfxM7T076LyGW0/iW/eEAD7Qfa9773vf1x+j1wJ3BG340xNmCqiEQA/xKRicaYTq+zuGTELiK+tHb0RWPMG/anz4hIvP31eFo/mbqyCMgxxhQbY5qAN2ido3JrTuo7xphnjDEzjDELgHJa5+/cWk/7LiKTaa0WutwYU2p/uttqo+7ISX33SM7qeyfHcWvO/nM3xlQAG4ElXZ3XFatiBHgGyDLG/LbNS2uAW+yPb6F1PqorJ4HZIhJkP+ZCHKgq6UpO7DsiMtT+32TgGuAl50brXD3tu71fbwA3GWPafmidrzYqIn60Vhtd09/x94UT++5xnNX3Lo7jtpzY9xj7SB0RCaR1nv5Qlyd3wQWEiwED7KN1CmEPrXPEUcCHwFFaV3lE2tvH0TqPWkXrlMspIMz+2mP2Dh4AXgD8B7o/Luz7J8BBWleFLHR13/qh70/T+k3kXNuMNse6ktZvKMeA/3Z13wa47y/Tek2pyf734Q5X928g+t7ZcVzdvwHq+2Rgt/04B4BHuju3lhRQSikvo3eeKqWUl9HErpRSXkYTu1JKeRlN7Eop5WU0sSullJfRxK6UUl5GE7tSSnmZ/w/m0EXLp2cziQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(gs10)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17a4fbaf",
   "metadata": {},
   "source": [
    "## 1.3 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9f182f04",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "\n",
    "num = len(gs10)                           # 总数据量\n",
    "x = torch.tensor(gs10['GS10'].to_list())  # 股价列表\n",
    "seq_len = 6                               # 预测序列长度\n",
    "batch_size = 4                            # 设置批大小\n",
    "\n",
    "X_feature = torch.zeros((num - seq_len, seq_len))      # 全零初始化特征矩阵，num-seq_len行，seq_len列\n",
    "for i in range(seq_len):\n",
    "    X_feature[:, i] = x[i: num - seq_len + i]    # 为特征矩阵赋值\n",
    "y_label = x[seq_len:].reshape((-1, 1))           # 真实结果列表\n",
    "\n",
    "train_loader = DataLoader(TensorDataset(X_feature[:num-seq_len], \n",
    "    y_label[:num-seq_len]), batch_size=batch_size, shuffle=True)  # 构建数据加载器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b9513687",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[2.8600, 2.8400, 2.8700, 2.9800, 2.9100, 2.8900],\n",
       "         [2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900],\n",
       "         [2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000],\n",
       "         [2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500]]),\n",
       " tensor([[2.8900],\n",
       "         [3.0000],\n",
       "         [3.1500],\n",
       "         [3.1200]]))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_loader.dataset[:batch_size]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "234b2cf6",
   "metadata": {},
   "source": [
    "## 1.4 构建基本神经网络模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c242b625",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "from tqdm import *\n",
    "\n",
    "class Model(nn.Module):\n",
    "    def __init__(self, input_size, output_size, num_hiddens):\n",
    "        super().__init__()\n",
    "        self.linear1 = nn.Linear(input_size, num_hiddens)\n",
    "        self.linear2 = nn.Linear(num_hiddens, output_size)\n",
    "\n",
    "    \n",
    "    def forward(self, X):\n",
    "        output = torch.relu(self.linear1(X))\n",
    "        output = self.linear2(output)\n",
    "        return output\n",
    "\n",
    "# 定义超参数\n",
    "input_size = seq_len\n",
    "output_size = 1\n",
    "num_hiddens = 10  \n",
    "lr = 0.01\n",
    "\n",
    "# 建立模型\n",
    "model = Model(input_size, output_size, num_hiddens)\n",
    "criterion = nn.MSELoss(reduction='none')\n",
    "trainer = torch.optim.Adam(model.parameters(), lr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c391b9ea",
   "metadata": {},
   "source": [
    "## 1.5 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8943e3ad",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 20/20 [00:00<00:00, 130.13it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: Validation loss = 0.7089\n",
      "Epoch 2: Validation loss = 0.4812\n",
      "Epoch 3: Validation loss = 0.2999\n",
      "Epoch 4: Validation loss = 0.2695\n",
      "Epoch 5: Validation loss = 0.2106\n",
      "Epoch 6: Validation loss = 0.2270\n",
      "Epoch 7: Validation loss = 0.1922\n",
      "Epoch 8: Validation loss = 0.1899\n",
      "Epoch 9: Validation loss = 0.1816\n",
      "Epoch 10: Validation loss = 0.1578\n",
      "Epoch 11: Validation loss = 0.1442\n",
      "Epoch 12: Validation loss = 0.1734\n",
      "Epoch 13: Validation loss = 0.1430\n",
      "Epoch 14: Validation loss = 0.1842\n",
      "Epoch 15: Validation loss = 0.1331\n",
      "Epoch 16: Validation loss = 0.1289\n",
      "Epoch 17: Validation loss = 0.1232\n",
      "Epoch 18: Validation loss = 0.1135\n",
      "Epoch 19: Validation loss = 0.1444\n",
      "Epoch 20: Validation loss = 0.1159\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_epochs = 20\n",
    "loss_history = []\n",
    "\n",
    "for epoch in tqdm(range(num_epochs)):\n",
    "    # 批量训练\n",
    "    for X, y in train_loader:\n",
    "        trainer.zero_grad()\n",
    "        y_pred = model(X)\n",
    "        loss = criterion(y_pred, y)\n",
    "        loss.sum().backward()\n",
    "        trainer.step()\n",
    "     # 输出损失\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        total_loss = 0\n",
    "        for X, y in train_loader:\n",
    "            y_pred = model(X)\n",
    "            loss = criterion(y_pred, y)\n",
    "            total_loss += loss.sum()/loss.numel()\n",
    "        avg_loss = total_loss / len(train_loader)\n",
    "        print(f'Epoch {epoch+1}: Validation loss = {avg_loss:.4f}')\n",
    "        loss_history.append(avg_loss)\n",
    "    \n",
    "# 绘制损失和准确率的曲线图\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(loss_history, label='loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0deedd27",
   "metadata": {},
   "source": [
    "## 1.6 模型预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "09dfd45d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "preds = model(X_feature)\n",
    "time = torch.arange(1, num+1, dtype= torch.float32)  # 时间轴\n",
    "\n",
    "plt.plot(time[:num-seq_len], gs10['GS10'].to_list()[seq_len:num], label='gs10')\n",
    "plt.plot(time[:num-seq_len], preds.detach().numpy(), label='preds')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55d0002b",
   "metadata": {},
   "source": [
    "# 2 RNN模型预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9ee5be9",
   "metadata": {},
   "source": [
    "## 2.1 数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d25a3d90",
   "metadata": {},
   "source": [
    "一般神经网络模型结构如下：\n",
    "<img src=\"./images/image1.png\" width=\"30%\" ></img>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24337a8b",
   "metadata": {},
   "source": [
    "循环神经网络模型结构如下："
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "a2bbceca",
   "metadata": {},
   "source": [
    "<img src=\"./images/image2.png\" ></img>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "291626d0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "\n",
    "num = len(gs10)                           # 总数据量，59\n",
    "x = torch.tensor(gs10['GS10'].to_list())  # 股价列表\n",
    "seq_len = 6                               # 预测序列长度\n",
    "batch_size = 4                            # 设置批大小\n",
    "\n",
    "X_feature = torch.zeros((num - seq_len, seq_len))      # 构建特征矩阵，num-seq_len行，seq_len列，初始值均为0\n",
    "Y_label = torch.zeros((num - seq_len, seq_len))        # 构建标签矩阵，形状同特征矩阵\n",
    "for i in range(seq_len):\n",
    "    X_feature[:, i] = x[i: num - seq_len + i]    # 为特征矩阵赋值\n",
    "    Y_label[:, i] = x[i+1: num - seq_len + i + 1]    # 为标签矩阵赋值\n",
    "\n",
    "train_loader = DataLoader(TensorDataset(\n",
    "    X_feature[:num-seq_len].unsqueeze(2), Y_label[:num-seq_len]),\n",
    "    batch_size=batch_size, shuffle=True)  # 构建数据加载器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ff31c7cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[[2.8600],\n",
       "          [2.8400],\n",
       "          [2.8700],\n",
       "          [2.9800],\n",
       "          [2.9100],\n",
       "          [2.8900]],\n",
       " \n",
       "         [[2.8400],\n",
       "          [2.8700],\n",
       "          [2.9800],\n",
       "          [2.9100],\n",
       "          [2.8900],\n",
       "          [2.8900]],\n",
       " \n",
       "         [[2.8700],\n",
       "          [2.9800],\n",
       "          [2.9100],\n",
       "          [2.8900],\n",
       "          [2.8900],\n",
       "          [3.0000]],\n",
       " \n",
       "         [[2.9800],\n",
       "          [2.9100],\n",
       "          [2.8900],\n",
       "          [2.8900],\n",
       "          [3.0000],\n",
       "          [3.1500]]]),\n",
       " tensor([[2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900],\n",
       "         [2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000],\n",
       "         [2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500],\n",
       "         [2.9100, 2.8900, 2.8900, 3.0000, 3.1500, 3.1200]]))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_loader.dataset[:batch_size]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d87ca39",
   "metadata": {},
   "source": [
    "## 2.2 构建循环神经网络模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "13181453",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "from tqdm import *\n",
    "\n",
    "class RNNModel(nn.Module):\n",
    "    def __init__(self, input_size, output_size, num_hiddens, n_layers):\n",
    "        super(RNNModel, self).__init__()\n",
    "        self.num_hiddens = num_hiddens\n",
    "        self.n_layers = n_layers\n",
    "        self.rnn = nn.RNN(input_size, num_hiddens, n_layers, batch_first = True)\n",
    "        self.linear = nn.Linear(num_hiddens, output_size)\n",
    "       \n",
    "    def forward(self, X):\n",
    "        batch_size = X.size(0)\n",
    "        state = self.begin_state(batch_size)\n",
    "        output, state = self.rnn(X, state)\n",
    "        output = self.linear(torch.relu(output))\n",
    "        return output, state\n",
    "\n",
    "    def begin_state(self, batch_size=1):\n",
    "        return  torch.zeros(self.n_layers, batch_size, self.num_hiddens)\n",
    "\n",
    "# 定义超参数\n",
    "input_size = 1\n",
    "output_size = 1\n",
    "num_hiddens = 10\n",
    "n_layers = 1\n",
    "lr = 0.01\n",
    "\n",
    "# 建立模型\n",
    "model = RNNModel(input_size, output_size, num_hiddens, n_layers)\n",
    "criterion = nn.MSELoss(reduction='none')\n",
    "trainer = torch.optim.Adam(model.parameters(), lr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "222bb56e",
   "metadata": {},
   "source": [
    "## 2.3 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "776fa213",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▌      | 7/20 [00:00<00:00, 62.68it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: Validation loss = 1.2063\n",
      "Epoch 2: Validation loss = 0.6640\n",
      "Epoch 3: Validation loss = 0.6163\n",
      "Epoch 4: Validation loss = 0.5854\n",
      "Epoch 5: Validation loss = 0.4029\n",
      "Epoch 6: Validation loss = 0.3159\n",
      "Epoch 7: Validation loss = 0.1687\n",
      "Epoch 8: Validation loss = 0.1145\n",
      "Epoch 9: Validation loss = 0.0840\n",
      "Epoch 10: Validation loss = 0.0751\n",
      "Epoch 11: Validation loss = 0.1014\n",
      "Epoch 12: Validation loss = 0.0798\n",
      "Epoch 13: Validation loss = 0.0535\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 20/20 [00:00<00:00, 63.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 14: Validation loss = 0.0552\n",
      "Epoch 15: Validation loss = 0.0517\n",
      "Epoch 16: Validation loss = 0.0510\n",
      "Epoch 17: Validation loss = 0.0488\n",
      "Epoch 18: Validation loss = 0.0574\n",
      "Epoch 19: Validation loss = 0.0516\n",
      "Epoch 20: Validation loss = 0.0457\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8+yak3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAw1klEQVR4nO3deXxU1f3/8dcn+55AViBAAgRICIIUWURAFNmsULWtS11Qq61Wq7W1dau19tevtW5Vq7W2xV2UVttiFVBxwQWQgOxr2BPICoQQss6c3x93AiFkmSST3JnJ5/l4zGNm7r0z95ObyXtuzrn3XDHGoJRSyvcF2F2AUkopz9BAV0opP6GBrpRSfkIDXSml/IQGulJK+Ykgu1ackJBg0tLS7Fq9Ukr5pNWrV5cYYxKbmmdboKelpZGTk2PX6pVSyieJyN7m5mmTi1JK+QkNdKWU8hMa6Eop5Sdsa0NXSvmv2tpa8vLyqKqqsrsUnxUWFkZqairBwcFuv0YDXSnlcXl5eURHR5OWloaI2F2OzzHGUFpaSl5eHunp6W6/TptclFIeV1VVRXx8vIZ5O4kI8fHxbf4Pp9VAF5F5IlIkIhubmf8DEVkvIhtE5CsRGdGmCpRSfknDvGPas/3c2UN/CZjRwvzdwGRjzHDgd8ALba6iLQo3wYcPQHV5p65GKaV8TauBboxZBhxqYf5XxpjDrqcrgFQP1da0I/vgy6egaEunrkYp5duioqLsLqHLeboN/QZgUXMzReQmEckRkZzi4uL2rSEp07ov2ty+1yullJ/yWKCLyBSsQP9Vc8sYY14wxow2xoxOTGxyKILWxfaDkCjdQ1dKucUYw1133UV2djbDhw/nrbfeAuDgwYNMmjSJkSNHkp2dzeeff47D4WDu3Lknln3yySdtrr5tPHLYooicAfwdmGmMKfXEezYrIAASh1pt6Uopr/fbdzex+cBRj75nVu8YfnPRMLeWfeedd1i7di3r1q2jpKSEs846i0mTJvHGG28wffp07rvvPhwOB8ePH2ft2rXk5+ezcaN1DMiRI0c8Wndn6/Aeuoj0A94BrjbGbO94SW5IytQ9dKWUW7744guuuOIKAgMDSU5OZvLkyaxatYqzzjqLF198kQcffJANGzYQHR3NgAED2LVrF7fddhuLFy8mJibG7vLbpNU9dBGZD5wLJIhIHvAbIBjAGPM88AAQDzznOsymzhgzurMKBiB5GHzzKhwrgqikTl2VUqpj3N2T7mqTJk1i2bJlvPfee8ydO5c777yTa665hnXr1rFkyRKef/55FixYwLx58+wu1W2tBrox5opW5v8Q+KHHKnJHw45RDXSlVAsmTpzIX//6V6699loOHTrEsmXLePTRR9m7dy+pqanceOONVFdXs2bNGmbNmkVISAiXXnopQ4YM4aqrrrK7/DbxzVP/k1zf+IWbYcC5tpailPJuF198McuXL2fEiBGICH/84x9JSUnh5Zdf5tFHHyU4OJioqCheeeUV8vPzue6663A6nQA8/PDDNlffNmKMsWXFo0ePNh26wMUfB8KQmTDnz54rSinlEVu2bCEzM9PuMnxeU9tRRFY316ztu2O5aMeoUkqdwncDPXmYFeiuf42UUqq7891AT8qE2goo22d3JUop5RV8ONAbdIwqpZTy4UBPHGLd65guSikF+HKgh8VY47pox6hSSgG+HOgAyVm6h66UUi6+HehJmVCyHepq7K5EKeVlAgMDT4ykeNFFF50YaGvPnj2ICM8888yJZW+99VZeeuklAObOnUufPn2orq4GoKSkhLS0tGbXs2fPHrKzszvrx2gTHw/0YeCsg9JcuytRSnmZ8PBw1q5dy8aNG+nZsyfPPvvsiXlJSUk89dRT1NQ0vTMYGBjoU2O41PPNU//rNRzTJTnL3lqUUk1bdDcUbPDse6YMh5l/cHvx8ePHs379+hPPExMTmTBhAi+//DI33njjacvfcccdPPnkk03Oa0lVVRU333wzOTk5BAUF8cQTTzBlyhQ2bdrEddddR01NDU6nk7fffpvevXvz/e9/n7y8PBwOB7/+9a+57LLL2rS+xnx7Dz0hAyRQO0aVUs1yOBwsXbqU2bNnnzL9V7/6FY899hgOh+O01/Tr149zzjmHV199tU3revbZZxERNmzYwPz587n22mupqqri+eef5/bbb2ft2rXk5OSQmprK4sWL6d27N+vWrWPjxo3MmNHSpZvd49t76EGhVqhrx6hS3qsNe9KeVFlZyciRI8nPzyczM5MLLrjglPkDBgxg7NixvPHGG02+/p577mHOnDlceOGFbq/ziy++4LbbbgNg6NCh9O/fn+3btzN+/Hh+//vfk5eXxyWXXEJGRgbDhw/n5z//Ob/61a/49re/zcSJE9v/w7r49h46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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_epochs = 20\n",
    "rnn_loss_history = []\n",
    "\n",
    "for epoch in tqdm(range(num_epochs)):\n",
    "    # 批量训练\n",
    "    for X, Y in train_loader:\n",
    "        trainer.zero_grad()\n",
    "        y_pred, state = model(X)\n",
    "        loss = criterion(y_pred.squeeze(), Y.squeeze())\n",
    "        loss.sum().backward()\n",
    "        trainer.step()\n",
    "     # 输出损失\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        total_loss = 0\n",
    "        for X, Y in train_loader:\n",
    "            y_pred, state = model(X)\n",
    "            loss = criterion(y_pred.squeeze(), Y.squeeze())\n",
    "            total_loss += loss.sum()/loss.numel()\n",
    "        avg_loss = total_loss / len(train_loader)\n",
    "        print(f'Epoch {epoch+1}: Validation loss = {avg_loss:.4f}')\n",
    "        rnn_loss_history.append(avg_loss)\n",
    "    \n",
    "# 绘制损失曲线图\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(loss_history, label='loss')\n",
    "plt.plot(rnn_loss_history, label='RNN_loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9fb61a7e",
   "metadata": {},
   "source": [
    "## 2.4 预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1f411f92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8+yak3AAAACXBIWXMAAAsTAAALEwEAmpwYAABc70lEQVR4nO3dd1xX1f/A8df5fNh7D5kyHLgFxL0tzRw50srKLLWyYd/2Hr/2XpbZtDSzrMxMy5FbQXFvAUUBRZC95/n9cRH4AComm/N8PHgA957P/byv0ZvDuee8j5BSoiiKojR/usYOQFEURakbKqEriqK0ECqhK4qitBAqoSuKorQQKqEriqK0EEaN9cZOTk7S19e3sd5eURSlWdq9e/cFKaVzTecaLaH7+voSGRnZWG+vKIrSLAkhTl/qnBpyURRFaSFUQlcURWkhVEJXFEVpIVRCVxRFaSFqndCFEHohxF4hxMoazpkKIZYKIaKFEBFCCN86jVJRFEW5oqvpoT8MHL3EubuBNCllAPAB8Na1BqYoiqJcnVoldCGEJzAa+OoSTcYBC8u+XgYME0KIaw9PURRFqa3a9tA/BJ4ASi9x3gOIA5BSFgMZgGPVRkKIWUKISCFEZHJy8tVHqyiK0sQcT8xi84mryGcxG6Agq15iuWJCF0LcCCRJKXdf65tJKRdIKUOklCHOzjUudFIURWlWXvjjEHd8s5OP1kVxxf0l4iPhx5thzfP1Ektteuj9gLFCiFjgJ2CoEGJRlTYJgBeAEMIIsAVS6jBORVGUJqe4pJQD8RnYWxjzwboTPPP7IYpLLjGQkXUelk4DazcY9kK9xHPFhC6lfFpK6Sml9AWmAv9KKadVabYCuLPs60llbdRWSIqitGjHz2eRV1TCS2M7MWeIP0t2nuHeRbvJKywxbFhcCD/fAXnpMPVHsHCol3j+8zx0IcQrQoixZd9+DTgKIaKB/wFP1UVwiqIoTdmeM+kA9PS25/HrO/B/4zqx/lgSt34VTmpOYUXDv5+EuHAY9ym4dam3eK6qOJeUciOwsezrFyodzwcm12VgiqIoTd3eM2k4WZngaW8OwO19fHG2NuOhn/Yy6fPtLJzRC69Tv0DkN9DvYegyqV7jUStFFUVR/qN9Z9Lp7mVP5VnaIzu7sfieMC5kF/DlkqWw6jHwHwrDXqz3eFRCVxRF+Q/Scgo5eSGHHt521c6F+jrwYC8b5iS9RLGlO0z8GnT6eo9JJXRFUZT/YF98OqCNn9dkWtK7WJPH0oC36u0haFUqoSuKovwHe8+koxPQ1dO2+smifMzjNrPeagwLjptdeX56HVEJXVEU5T/YeyaN9m42WJrWMLfk3D4oKcQhaBCnU3KJPJ3WIDGphK4oinKVSksl++LSaxw/B+BMOADd+16HhYmeZZHxDRKXSuiKoihXKSY5m6z8Ynp42dXcIG4nOPhjae/GDV3c+evgueqLjeqBSuiKoihXaW/ZgqIeNT0QlRLiIsC7NwATe3qSXVDMP4cT6z0uldAVRVGu0t64NGzMjPBzsqx+MvUk5F4Ar14AhLV1wNPenGW763/YRSV0RVGUq7T3TDrdve3R6WrY9qFs/BwvrYeu0wkm9vRkW8wFzqbn1WtcKqEriqJcheyCYo6fz6LnpR6IxkWAmS04tSs/NLGnJ1LC73sT6jU2ldAVRVGuwv64dKS8xPg5aAndKwx0FenV29GCXm0dWLY7vl7npKuEriiKchX2ntHmlHf3tKt+Mi8Nko+Vj59XNinYk1MXcsorNNYHldAVRVGuwt4z6fg7W2JrYVz9ZNwu7XPZ+HllN3Rxx9xYX68PR1VCVxRFqSUpJXvj0i8/3CL04NGz2ikrUyNGdXZj5YGz5BfVz5x0ldAVRVFq6UxqLqk5hZdeIRoXAe5dwaSG6Yxowy5Z+cWsOXK+XuJTCV1RFKWWyhcUedXQQy8pgoTd2gPRS+jt50hbJ0viUnPrJb6r2rFIURSlNdt7Jg0LEz3t3ayrn0w8CEW5l03oOp1g7SMDMdLXT19a9dAVRVFqac+ZdLp52qGvaUFR3E7t82USOlBvyRxUQlcURamVvMISjp7LvMz4eTjYeoGtR4PGVdkVE7oQwkwIsVMIsV8IcVgI8XINbaYLIZKFEPvKPu6pn3AVRVEax6GzGRSXysvMcNl5xd55favNGHoBMFRKmS2EMAa2CiFWSynDq7RbKqV8oO5DVBRFaXzlC4pqKpmbHgeZCU0/oUttnWp22bfGZR8Ns5+SoihKE3HsXBauNqY4W5tWPxkXoX32btyEXqsxdCGEXgixD0gC1kopI2poNlEIcUAIsUwI4XWJ68wSQkQKISKTk5P/e9SKoigNLCopm3auNcxuAS2hG1uCS6eGDaqKWiV0KWWJlLI74An0EkJ0rtLkT8BXStkVWAssvMR1FkgpQ6SUIc7OztcQtqIoSsMpLZXEJGfj72xVc4Mz4eAZAvrGnQl+VbNcpJTpwAZgZJXjKVLKgrJvvwKC6yQ6RVGUJuBsRh65hSUEutaQ0Auy4fyhRh8/h9rNcnEWQtiVfW0OjACOVWnjXunbscDROoxRURSlUUUlaY8RA11qGHJJiARZ2ujj51C7WS7uwEIhhB7tF8DPUsqVQohXgEgp5QrgISHEWKAYSAWm11fAiqIoDS2mLKEHuNTQQ4/bCQjwDG3YoGpQm1kuB4AeNRx/odLXTwNP121oiqIoTUPU+WwcLU1wsDSpfjJ2C7h20nYpamRqpaiiKMoVRCVl1dw7z8+A09shcES1U6WytF53J6qJSuiKoiiXIaUkOim75oQevR5Ki6GdwTwRsgqzuPnPmxm7fCy/Rf1GUUlRg8SqErqiKMplJGcVkJlfTGBNCf3E32DuYDB+XlxazGObHiMmPQZjvTEvbn+RUb+N4ocjP5BbVD9lcy9SCV1RFOUyyme4VF1UVFoCUWsg8DrQ6QGtN//mzjfZfnY7z/V+jl/H/Mr84fPxtPbk7V1vc/2v1zN//3wyCjLqJVZVD11RFOUyoi81wyVup7YpdPuK4ZbFRxez9PhS7up0FxPbTQSgn0c/+nn0Y1/SPr46+BXz9s3jQt4Fnuv9XJ3HqhK6oijKZUQlZWFtZoRL1RouJ1aDzgj8hwKwOX4z70S+w1CvocwNnlvtOt1duvPpsE85nnocGxObeolVJXRFUZTLiDqfTaCLFUJU2dTixD/g0w/MbDmeepzHNz1Oe/v2vDHgDXTi0qPZ7R3a11usagz9opIi2L8UvhoO2z9t7GgURWkiYpJrmOGSegqSj0G7kSTnJjNn/RysTKz4dNinWBhbNE6gqB46FObAnu9hxzzIiANTG1j7Anj31ortKIrSaqXmFHIhu7D6kv8T/2if24/kjZ1vkFmYycKRC3GxcGn4ICtpvT303FTY8Dp80An+fgpsPeGWpTD3INh4wG8ztaI7iqK0WuUPRKsW5TqxGpzakWPtyqa4TUwInEBHx46NEKGh1pnQs5NgwWDY9BZ494EZa2DG39rTanM7uGm+9ifVP880dqSKojSi8oReuWxufibEboN2I9kUt4nC0kKu87mukSI01PqGXApzYclUyEnWEnlNFdJ8+0G/h2Hbh9oKsA43NHiYiqI0vqikLMyN9XjYmVccjPkXSoug/SjWnPwZZ3Nnurt0b7QYK2tdPfTSEm0oJWEPTPzq8uUuhzwLbl1gxYNaj15RlNbhyApYNgOyzpcv+dfpKs1wOfE3mNmR69qZrQlbGe4z/LKzWhpS04iiHiVl5rM95gIFxSWw5nk4thJGvgkdRl/+hUYmMOFLKMiCPx6ABi6yoyhKA8vPgN9mw8+3w6Ff4fuxpJyPN5zhUml16KZz2ygoKWgywy3QwhN6QXEJd3yzk1u/jODdV/4H4fM40XYaFzrfVbsLuHSEES9D1D+w+9v6DVZRlHqRX1TC3J/2cijhMsvtT22Gz/vBwV9g0JNw+3Jk2mney3+RzvaVCmvFR0JuCrS7nrWn1+Jk7kQPl2rVxRtNi07oH6+P4lhiFvOCE3la9z2bRC9GHh1J6GvrGD9vGxuO12Iopdds8BsM/zwLF6LrPWZFUerWygPnWL7vLB+uO1H9ZFE+/P0MLBwDehO4ew0MeQb8hxAz4ivaikQmH3lQmxUH2uwWoSfXtx9b4rcw3Hs4+rI6Lk1Bi03o++PS+XxjNM+2P8voE8+ha9ONgU/9zp8PDeSR4e04nx/N4yuXkpGfefkL6XQw/nPQG8OfD0FpacPcgKIodeKHHbEArD+WRFxqRbXDosxzbP96AMXh8yD0Hrh3i8Hak736bswq+h/WmTGwaII2JHPiH/Dpy+aU/eSX5HOdb9MZboEWmtDzs1LZsvg11pk9xczTj4GlM9yyFGFqhZeTINV8MdlO71LgtIABSwdwy8pbeD/yfTbHbya7sIa55zZt4LpX4fQ22Pt9w9+Qoij/yb64dPbHZ3DvIH90QrAo4jQAaflpzPrzZmab5/PNoNkw+j0wsTR4bXRSNuGiB6WTF0LiIfj2Bkg6Au1GsiZ2DY5mjvR06dkYt3VJLSehSwnxu2H5HPQfdOCB/AU42dvD2E/g/h1IKxfWxK5h3PJx/B79O7e2v53ihJkEmozH1MiURUcXMWf9HPr91I9FRxZVv36P28F3AKx5AbISG/7+FEW5at/viMXK1IgHhgYwoqMrP++K41DycW5ZMYkDRWkEGdnwRfx6Tmeervba6KRs/Jwt0Xe8ASZ/py31B3L9BmvDLT5Na7gFmuM89Ix4iN0K6We0j4w4SI/TjpcUUGJkwS9F/UhpfysPTpsMQGJOIq9tfYqNcRvp6NCRT4d9SifHTpw9tZetUcnsfPZFSmQhB5IP8MWBL/hk7yeM9huNvZl9xfsKAWM+gs/6wKrHYcoPjXP/iqLUSkp2ASv3n2NqLy+sTI24o68Pa0//y51/P4dtaRHfJmfhftevjF0znf8L/z++HPGlQQGuqKRsuniW7RPa8UaY+iPER7IlP0EbbmlCs1suumIPXQhhJoTYKYTYL4Q4LIR4uYY2pkKIpUKIaCFEhBDCt16iBe0p8++zYcNr2nhWQZY2XzxsFoWjP2Gs6dfMs3yQuybfBMAf0X8w/o/xhJ8N53/B/+PH0T/SybETAGO7tSEtt4itURcwMzKjl3svng17lvySfL49VMOsFkd/GPwkHF0Bx/6qt1tUFOXa/bQrjsKSUu7o44OUkiM5y7Hw/AHzQmuWnDlN17AHcXZqz9yec4k4F8HKkyvLX5tfVEJcWq7hLkXtroehz7L29FoczBwIdg1uhLu6vNr00AuAoVLKbCGEMbBVCLFaShleqc3dQJqUMkAIMRV4C5hSD/GC/xB4YLdWe8XYzODUWyuPcDjlFIvv6YqZMby18y0WHV1EqFsoL/d9GS9rL4P2A9s5YWNmxIr9ZxnSQSuq42fnxw1tb2DJsSXc0ekOnMydDN+/70Nw6Df46zFtCMasfuoaK4ry3xWXlPJjxBn6BTji62TOM1ufYeXJlXSwHsCjB8Kxt3SC3vcDMLn9ZFacXME7u95hgMcA7MzsiEnORkqqFeXKK85jc/xmxviNaXLDLVCLHrrUXHxSaFz2UXWVzThgYdnXy4Bholrx4DpiZgtOAdWS+faYC3yz7RS39/ahi7cJD6x/gEVHFzGt4zQWjFhQLZkDmBrpGdXZnTWHE8krLCk/fl+3+ygqLeKrg19Vf3+9MYz5GLLOwfpqf6woitIErD+WREJ6Hrf39uWzfZ+x8uRK5nSfw0L/YfQWMfxqeyeYaGVudULHi31eJKswi/d2vwdcepeirQlbySvOa3KzWy6q1UNRIYReCLEPSALWSikjqjTxAOIApJTFQAbgWMN1ZgkhIoUQkcnJydcUeGVHz2Uy+4fdtHWy5NZ+5tz2121EJEbwUp+XeLLXkxjpLv2HyNjubcgpLOHfYxVz0r1tvBkXMI6fj/9MYk4ND0A9gyHsXtj1NZyp+k+hKEpj+2HHadrYmmFqc5wvD37JhMAJ3NtpBhabX+W8WVtePtOdC9kF5e3b2bfjzk53sjx6ObsSdxF1Phu9TuDrZFjbfE3smiY73AK1TOhSyhIpZXfAE+glhOj8X95MSrlAShkipQxxdnb+L5eoJi41lzu+2YmliREP31jK3etuJ6Mgg6+u+6p8T7/L6e3niLO1KSv2Jxgcn911NhLJggMLan7h0Oe0YZ8VD0JRXl3ciqIodSA6KYut0RcYG2LO89ufpb19e57u9TTs/g5ST1Iy7GXyS2DprjiD183uNhsPKw9e2fEKJ86n4eNogalRxbBKfnE+m+I3MdR76GU7iY3pqqKSUqYLITYAI4FDlU4lAF5AvBDCCLAFUuosykoOJh/kp+M/kV+cT2ZBLpFnkih2KsDH2ZgXIk7ib+fPJ0M/wcPKo1bX0+sEo7u48+POM2TmF2FjZgxAG6s2TAqcxLITy7ir813Vh2xMreDGD2DxJPhiENz0OXg0zd/aitKa/LDjNCb6UnbnfUxJaQnvDX4Ps+JC2PQmtB1Im5Cx9NsfwaLw08we6IeRXuvXmhuZ83zv57l33b0k5f5Ce6dhHEw+SHpBOukF6RxOOawNtzTB2S0X1WaWi7MQwq7sa3NgBHCsSrMVwJ1lX08C/pWyfqpZpRWksStxF8dTT7A7/jRFJUV0dnfB386baR2nsWjUolon84vGdm9DYXEp/xwyHF6Z2XUmep2eL/Z/UfMLA0fAtN+gMFvbum7dy1BcUHNbRVHqXXZBMb/uSSCg4waOpR3m//r9Hz42PrDtI60Gy4hXQAju6OPLuYx81h01LP/Rz6Mf1/uMItdiDXt5kltX3cr96+/nma3PsPjoYnxsfAh1C22ku7uy2vTQ3YGFQgg92i+An6WUK4UQrwCRUsoVwNfAD0KIaCAVmFpfAQ/0HMiKcau585udZJ5O46s7Qxjc/tq2ferhZYeXgzkr9p9lckhFT9zFwoUp7aew6Ogi7u5yN21t21Z/ccAwuH+HthnG1vfh+GoY/xl4NK0VZIrSGvy+J558kz3Elazl9qDbGe4zHPLStC0mu0yGNlohrWEdXPCwM+f7HbGM7OxmcI3bAh7mjwgjbgkJZFg7P2xNbbE3s8fO1A5rE+smUyq3JldM6FLKA0C1cmJSyhcqfZ0PTK7b0GpWXFLKQ0v2EnEqlY+mdr/mZA4ghGBM1zZ8sfkkF7ILcLIyLT83o/MMfjnxC5/v/5y3B75d8wXMbGHcPAgar42pfzUcBjwKg5/WasEoilLvikpK+SoiAguPX+nq3I1Hgh/RTsT8C8V50GtWeVsjvY5bw7x555/jDH1vI5Wn5OUVllCU0Y+bO/Sns4dtw97ENWp22eaX3fGsOXKeF8cEMa771Q2tXM7Y7m0oKZWsOnjO4LijuSO3dbyNv0/9zfHU45e/SOAIrbfe9WbY/Dase7HO4lMU5fI+2xBDstl3WBib8e6gdzHWac/DiFoH5vbVnnFN6+3D5GBPOrrb0KHSRw8fe+7s40MHN+sa3qVpa5qPai/j5hAvXKxNGdbRtU6v28HNhnauVqzYd5Y7+vganJveaTrLTizjqS1PsfiGxVgYW9R8EdB+cMZ/rhX62f4x2PtoldwURak3h89m8MnGg5gHxnN3l4dwsywbRiktheh14D8UqiwEsjU35p3J3Roh2vrT7Hroep2o82R+0dhubYg8nUZCuuE0RFtTW94a8BYx6TG8vONlrvi8VwgY+RYEXq/VfTmxpl7iVRQFCotLefTn/djapAPgb+dfcTLxAOQkQcCIxgmugTW7hF6fxnRrA8DPVeanAvT16Muc7nNYdWoVS44tufLF9EYw6Rtw7Qy/TIdz++s4WkVRAD79V9vIZlJvEwDDyQvRa7XPAcMaIbKGpxJ6JT6Olozq7ManG6LZElV9JevMrjMZ5DmIdyLfYV/Svitf0NQKbv1ZG4b5cYpWEVJRlDpzMD6DeRtjmNjTE0urVIyEEZ7WnhUNotaBe3ewuvbJE82BSuhVvDO5G4EuVty/eE95PYeLdELHa/1fw83CjUc3PUpKXi3WTtm4w20/Q2EOLL4ZrrRDkqIotVJQXMKjv+zDycqEF8YEcSrjFF42XhUPQ/PSIH6nNlmhlVAJvQorUyO+ujMEUyMddy/cRVpOocF5W1NbPhjyARkFGTyx+QmKS4uvfFHXTnDz93DhOCydpm1lpSjKNflwXRQnzmfz5sSu2JobczLjJG1tKg23xGwAWQoBwxsvyAamEnoNPO0tWHBHCOcy8pm9aDeFxYb7iHZw6MDzvZ9nZ+JOPtn7Se0u6j8Exn6qbc6xYAicP1IPkStK67D3TBpfbIphSogXQ9q7UFRaxJmsM1XGz9dra0Q8Qi59oRam2U1bbCg9ve15Z1JXHv5pH8/+fpC3J3U12M1kXMA49ifv55tD37A8ejnulu60sWpDG8s2uFu5086+XfUlwt1v0aYx/jIdvhqm7YDU9eaGvTFFaQHeWH0MVxsznr2xIwAJWQkUlxbjZ+enNZCyYrqivvWkudZzp//BuO4exCTn8PH6KAJcrJg9yN/g/FO9nsLP1o+YjBjOZp8lKi2KzfGbKSjR6rnM7TmXu7vcbXhRn74wewssuwt+mwlxEXD962BkiqIoVyal5HBCBpNDvMqL6Z3KOAVQMeSSeBCyE1vNdMWLVEK/grnDAolJzubNv48Rk5zN8I6u9A90wsLECBO9CdOCphm0l1KSkp/C27ve5sM9H2JtYs3N7av0wq1d4Y4/tA0ytn8CZ/fBzQu1cryKolzWuYx8cgpL8K+0+cSpTC2h+9r6agfKpyu2nvFzUAn9inQ6wXuTu2FurGf1wUR+jozHxEhHHz9HhnV0YWgHFzztK1aOCiFwMnfitf6vkVOUw6vhr2JtYs2otqMML6w3huteBc9esPx+mN8fxn4CHcc08B0qSvMSVTb7rPJ+n6cyTuFs7oy1Sdly/ah14NZV6zy1IuqhaC2YGet5d3I39rwwgh9nhnF7bx9Op+Twwh+HGfD2BpbsPFPtNcY6Y94b9B49XXvyzJZn2By/ueaLB42FWRvBzkebAfPnw9oUR0VRahR1PgswTOgnM05WPBDNS9eGMlvRdMWLVEK/CsZ6HX39nXj+xiA2Pj6Efx8dxMBAZ579/SCrqxT1AjAzMuOToZ8QaB/IoxsfZff53TVf2CkA7l4L/R6G3Qu1DTPO7qvfm1GUZiomORt7C2Mcy6qiSik5lXGqIqGf3AiypNWNn4NK6NfEz9mKz6f1pLuXHQ//tI/t0ReqtbE2sWb+iPm4WbrxwPoHOJpytOaLGZloxffv+KNiw4xtH2nFhRRFKRd1PptAl4pKiCn5KWQVZlUk9Oi12nRFz6a7EUV9UQn9GlmYGPHN9FB8nSyY+X0kB+OrLxpyMHPgy+u+xNrEmul/T+f1iNeJSY+p+YJ+g+C+7dDuelj7Aqx6rJ7vQFGaDyklUUnZBLgajp9D2QwXKbX5535DWtV0xYtUQq8DdhYmfD8jDDsLE6Z/u5OTydnV2rhZuvHN9d8w1Hsoy04sY/wf45n+93RWn1pNUUmRYWMLB5iyCHreCXu+h6zEatdTlNboQnYhGXlFBDhXT+h+dn5w/hBknWuV4+egEnqdcbM144e7ewFw+9c7SczIr9bG09qTNwa8wbrJ63gk+BEScxJ5YvMTDF82nMVHFxs2FkIbUy8thshvGuIWFKXJi0oqeyBapYdubmSOi4ULRLXO6YoXqYReh/ycrfjurl5k5BVx21fh/HM4kaKS6mPgDmYOzOg8g1UTVvH58M8JsAvgzZ1vsuHMBsOGjv7a0EvkN2rzaUUBYsqnLFaMoZ/KOIWvja+212f0OnDrAtZul7pEi6YSeh3r4mnLl3eEkF1QzOwfdtPvzX95559jxKXmVmurEzr6e/Tn8+Gf09GhI89te45z2VVmy4TdCznJcOjXBroDRWm6opKysTI1wtWmYmV1+QyXwlxtuqJ/66h9XpMrJnQhhJcQYoMQ4ogQ4rAQ4uEa2gwWQmQIIfaVfbxQ07Vaiz7+jmx7cihf3hFCFw9bPt8Yw4C3N3D71xFsOJZUrb2J3oR3B71LiSzhic1PUFRaaUzdbzA4d4Dwz7UHPorSikWdzybAxaq8rlJecR5nc85qCf3sHm2I0rtPI0fZeGrTQy8GHpVSBgG9gTlCiKAa2m2RUnYv+3ilTqNshoz0OkYEufL19FC2PTWUR4a3IyYpm7u+28W/x85Xa+9t482LfV5kX/I+Ptv3WcUJISBstraV1pkdDXgHitL0RCdrCf2i05mngbJdiuIitINevRojtCbhigldSnlOSrmn7Oss4CjgUd+BtSTutuY8PDyQfx8bTKc2Nsz9aR9nUqoPwYxqO4qJgRP5+uDXbE/YXnGi61Qws4OI+Q0XtKI0MRm5RSRnFVRb8g9lCf1MBDi102aJtVJXNYYuhPAFegARNZzuI4TYL4RYLYTodInXzxJCRAohIpOTq2/x1tKZGev5/LZgAO5dtJv8opJqbZ7s9ST+dv48vfVpLuSVLVQysYDgO+HoSkivvt+porQG0ck1z3DRCR0+Vl7a7kReYY0VXpNQ64QuhLACfgXmSimr7qO2B/CRUnYDPgGW13QNKeUCKWWIlDLE2dn5P4bcvHk7WvDh1O4cOZfJC38cqnbe3Micdwe9S25RLk9tfoqS0rKkHzoTkLDry4YNWFGaiKjz2gyXAGfDGS4eVh6Ypp/RtpxTCf3KhBDGaMl8sZTyt6rnpZSZUsrssq9XAcZCCKc6jbQFGdrBlQeHBvBzZDw/1VDYy9/On2fCniEiMYKFRxZqB+28oMONWq0XVbxLaYWikrIxM9bhYW9efqy8KNfF8XPv3o0UXdNQm1kuAvgaOCqlfP8SbdzK2iGE6FV23VrsoNx6zR3ejgGBTryw4nCN5QLGB4wnzC2M36N+rzjY+z7IT4cDSxsuUEVpIqKTsvF3tkKv02a4lJSWcDrztLbk/0wEmDuAY0AjR9m4atND7wfcDgytNC3xBiHEvUKIe8vaTAIOCSH2Ax8DU6VUc+wuR68TfDS1B06WJty3eDfpuYabUQshGOg5kNjMWBJzypb+e/fRajxHfKGmMCqtTnSS4QyXcznnKCgpKOuhh2vDLZW2iWyNajPLZauUUkgpu1aalrhKSjlfSjm/rM2nUspOUspuUsreUsrtV7quAg6WJnw2LZjzmfk8/dvBaud7t9H+fAw/F64dEELrpScf00qEKkorkVNQTEJ6Xs0zXEwdICUavFv3+DmolaKNrruXHTP6t2XNkfOk5Rj20gPtAnEwc6hI6ACdJ4K1O/zzDBRVrxejKC1RTFnBu4AqS/4B2maWzQZr5Q9EQSX0JmFUZ3dKSiUbTxiuIhVCEOYeRsS5CMpHsIxMta3qko5oe5IqSitQPsOlyj6idqZ22CceAp0xtOnRWOE1GSqhNwFdPWxxsTZl7ZHqK0h7u/fmQt4Fw/rpgSOg1ywI/0yr/awoLVxUUjbGeoGPY8X+vSfTK81wce8GxuaXuULroBJ6E6DTCYZ1dGXT8WQKig0XG/V218bRIxKrrOUa8YpW42X5/ZCjJhQpLVt0UjZtnSwx1lekrNjMWPysfSBhT6ufrniRSuhNxIggF3IKSwg/mWpwvI1VG7ytvQk/G274AmNzmPAl5KbAnw+pWS9KixadlGUw3JKen05qfipthQmUFLTq+i2VqYTeRPT1d8LcWM+6GoZdwtzD2HV+F8WlxYYn3LvCsOfh2ErY+0MDRaooDSu/qIQzqbkGD0RjM2MBaJtbtmjdS/XQQSX0JsPMWM/Adk6sO3qeqlP4e7v3Jqcoh0MXqpcKoM+D4DsAVj8FKZfYp1RRmrFTF3IoldQ8ZfFCLNj7grVr4wTXxKiE3oQM7+jKuYx8Dp81LJXTy60XAmE4ffEinQ5umq9tiPvbTKi6P6miNHNRSTXMcMk4hbHOmDbx+9R0xUpUQm9ChnZwQQiqzXaxM7Ojg0MHIs7VVOQSsPWEGz+EhN1q/1GlxYlOykYnoK2TZfmxkxkn8bFsgz4nSSX0SlRCb0IcrUwJ9rZn3dEapi+26c2+5H3kFlWvow5A5wnaOOKOeVBavSyvojRX0UlZ+DhaYmasByA5N5mIcxF0M7bXGqiEXk4l9CZmRJArh89mkpCeZ3C8t1tvikuL2ZO059Iv7jMH0k/Dsb/qOUpFaThR57WiXBd9ceALikuLubvUAkxtwKVjI0bXtKiE3sQMD9Ie7qyv0kvv4doDY53xpYddADqMBjsfrZeuKC1AUUkpsSk55ZtaxGXF8euJX5kQOAGvhIPgGQI6fSNH2XSohN7E+Dtb4edkWW0c3dzInO4u3Wt+MHqRTq8V74oLh/jd9RypotS/0ym5FJXI8hkun+37DL1Oz+z2t2jlL9R0RQMqoTdBw4NcCT+ZQla+4YyV3u69OZZ6jLT8tEu/uMc07c/QcNVLV5q/6EozXKLSovjr5F/c2uFWXFJjAakWFFWhEnoTNCLIlaISyaYThvuuXrIMQGWm1tr+o4eXq/1HlWYvOknbR9Tf2YpP9n6CpbElMzrP0Da0EDptyEUppxJ6E9TT2x57C+Nqq0aDHIOwMra6/Dg6QK/Z2uedX9RThIrSMHbFpuFpb05M5hE2xG1geqfp2JnaQsx6cO2sdWCUciqhN0F6nWBoB1f+PZZEUUlp+XEjnRGhbqHV67pUZecFQeO0/UcLsuo5WkWpHwfi09l0IpkpIV58vOdjHMwcmBY0TduxK2E3BE9v7BCbHJXQm6gRQS5k5hcTGWs4Xh7mHkZ8djzxWfEAFJQUcCz1GCtPrmTBgQVcyCsr9t/nASjIhL2LGjp0RakTH66Lws7CmE7+54lIjGBml5lYpsbC2hcg8HoImdHYITY5Ro0dgFKzAYHOmBjpeHP1UXr7O+JibYarjSmWem3O7aObHiWnKIe4rDhKZanBa2d1nQWewdoMgPDPtNrpamqX0ozsi0vn32NJPHZdO7489AJulm5M9rsRvhkFZrYwbl6r3z+0JiqhN1GWpkbc3b8tK/ad5ZutpygquViwS2Lu3ZazRhmEegQxqu0o/O38CbAN4OEND3Mk5UjFRfrMgZ9v16oxBo1rlPtQlP/iw3UnsLcwxtfnFF9sPcQrfV/BdMMb2lTF234FK+fGDrFJumJCF0J4Ad8DroAEFkgpP6rSRgAfATcAucB0KeVlljQqtfHkyA48ObIDUkrSc4s4n5VPUmYBr6+ywTLTiPdv62vQvpNTJ/Ym7a04UL7Q6DOV0JVmY8+ZNDYeT+ax6wP4+tBT+Nr4MkaaQ8R8CLsPAoc3dohNVm3G0IuBR6WUQUBvYI4QIqhKm1FAYNnHLODzOo2ylRNCYG9pQgc3Gwa2c2ZQe2cOxKeTX2RYs6WTYycScxIrxtErLzQ6c4WZMYrSRHy4LgoHSxM8PE4QnR7NnA7TMPrjAXDpBMNfauzwmrQrJnQp5bmLvW0pZRZwFPCo0mwc8L3UhAN2Qgj3Oo9WASDUx4GiEsmB+AyD450cOwEYDrv0uB0snGDj6w0ZoqL8J7tPp7L5RDIzB/jwzeEFBNoFct3uXyA/EyZ+BcZmjR1ik3ZVs1yEEL5AD6Bqd88DqLyKJZ7qSR8hxCwhRKQQIjI5ObnqaaWWgn20KnO7Yg23q+vo2BGB4HDK4YqDplbQ/xE4uRFitzZglIpy9T5YG4WTlQmOboeIzYxljlU7dNFr4bpXwbXqwIBSVa0TuhDCCvgVmCulzLxS+5pIKRdIKUOklCHOzuqhxn9lb2lCoIsVkVUSuqWxJW1t2xr20AFC7wYrN/j3tbrfe/TEGtj1FcTthMKcur220qrsik1la/QF7inrnXe0b8/Q3T9D24HQa2Zjh9cs1GqWixDCGC2ZL5ZS/lZDkwTAq9L3nmXHlHoS4uvAygNnKS2V6HQV07c6OXaqvpLU2BwGPgarHoOYfyFg2LUHICVseA02v1NxTOjAMVDb69Stq1ZXxsLh2t9LaRU+WHsCJytTbJz3khCbwDNuwxG5a2HYi2qKYi1dsYdeNoPla+ColPL9SzRbAdwhNL2BDCnluTqMU6ki1NeerPxiTiQZrgQNcgwiKS+JpNwkwxf0vANsPLUkfK299OJC+P1eju/4kJfah/Hb+Hdg6o8w8Alw8IPT22Ht8/DzHXX/F4HSIkWcTGF7TAr3DPDkm8Nf0s2xMwP2/Q6B16l6LVehNj30fsDtwEEhxL6yY88A3gBSyvnAKrQpi9Fo0xbvqvNIFQOhvlrPd1dsGh3cbMqPd3KqeDDqYuFS8QIjUxj0BPz5EJz4G9qP+k/vK3PT2PbzJBbmnybc0x0Kz7H8wGcEjvqBLh1GVzTc9TX89T/Yt1jrqSvKJZSUSl796yiuNqaYO0ZyPvY8r9p0ReSlweCnGzu8ZqU2s1y2SimFlLKrlLJ72ccqKeX8smRO2eyWOVJKfyllFyllZP2H3rp52pvjamNabRy9vX17dEJn+GD0ou63gn1brZdeWlr9/GUUlhTy+/6vmfDTIO4TScRYO/Nwz4dZPWE1LhYuPLXlKcPt8YLv0laqrnkOstUDcOXSlu6K42BCBo+NbMu3h78ixLk7YXuXQbtR4NGzscNrVtRK0WZKCEGIr0O1Wi8Wxhb42fpx+EINCV1vDIOfgt9nw9EV0Gm84fm007DuJTi1SZvqaO0KVm7kWTowKyOSfflJtCst4bWguxgVOhdjvTEAr/V/jbv/uZu3d73NS31f0q6l08GYj2B+f/jnGZj4ZZ3/GyjNX1pOIW//c4xebR3INtlMSn4K79n2RORnwBDVO79aqjhXMxbqY09Cel61/Uc7OXbicMphZE3j110mg1M72PhGxWbSBdmw/v/g01A4vlobt3RuB8UFlMSF89Sp39mfd56XMktZNmYZY3s/Xp7MAULdQpnReQa/Rv3K+tPrK97LpQMM+B8c/Bmi19XHP4HSzL239jhZ+cU8dYMv3x76lr6uoQTvXQYdbgT3bo0dXrOjEnozFlI2jl512KWTUydS81M5n3u++ot0em1cMvkYHPwF9i2BT0Ngy7sQNBYejISb5sOURZTe9Tf3txvLvxamyPMjeTLhdZaetqp+TWBO9zl0dOjISzteMnwg2/9/2syXlf+DwtwaX6u0TocSMlgccYbbe/twKHMtaQVpPCDtoCBD+0tSuWoqoTdjHd1tsDI1qrbA6OKK0RqHXQCCxmubAyy/D5bfC9bucPdabSWerSelpZK/D51j4IKX2J68ArOcoTw/7GH6t3fnqd8O8mPEmWqXNNYb89bAt8gvzuf5bc9XVIA0NoMxH0L6adj0Zh3evdKcSSl5ccVhHCxMeGREO7YkbCHQ1o8ue3+GjmPBrUtjh9gsqYTejOl1gp4+9tXG0dvZt0Mv9DU/GAVtfPv618G1E9z0Bdyzvnxvxt2n07jh4y08sOIbMsx/p7PtQLbNeo+bQ7yYPy2YIe2deeb3gywKP13tsm1t2/J46ONsP7udxUcXV5zw7a+VINj+KSQerLP7V5qv3/cmsPt0Gk+O6oCpcQl7zu+hT4kRFGarmS3XQCX0Zi7Ux57j57PIyK3YUNrMyIwAu4DqK0Yr8xsE926FblO1BA+En0zh9q8jSJdHsfJcRrBrCAvHfICJkfbs3MxYz/zbgxnWwYXnlh/ihx2x1S47ud1kBnsN5sPdH3Ii7UTFiRGvaIuMVjxUMXavtEpZ+UW8vuoY3b3smNTTk33J+ygsLaR37G7tQb1a4v+fqYTezIX4OiClVnK0sk5Ol3kwWoPtMRe469tdODudA5dv8bXx4aMhH2KiNzFoZ2qk57NpPRne0ZXn/zjMwu2xBueFELzc92VM9aYsPLyw4oSFA4x8E87ugcO//6d7VVqGj9ZFkZJTwCvjOqHTCcLPhmOEIDg7AwapsfNroRJ6M9fdyw4jnahxHD29IJ2zOWeveI3t0ReYsegfrLx+ItX2faxMrPh8+OfYmtrW2N7USM9nt/VkRJArL644zM+74gzOO5g5MMhrEJvjN1NcWlwpqAlgZqdNi1RapeikbL7bHsvUUG+6etoBEH7qH7rl5WHR+35tZpTyn6l56M2cuYmezh621cbRKz8Y9bCqVviy3N9HYvjfmvcw9tmBNNIzM2gmMzrPwMqk5tksF5kY6Zh3a09u+yqcD9adYGKwJ/pKNWWGeA1h5cmV7E/eT7BrsHZQpwOfvlppAKVWlh5bihCCbs7d8Lfzx0hX9r9sUT6kREHycbhwQpu1lHwCMhPA3A6sXMs+XLTPbXpAu+sb9V4Aluw8gxDw2HXtAMhIjeFIdhz3621g2AuNHF3zpxJ6CxDqa8/CHacpKC7B1EjbOzTQPhAjnRGHUw5zne911V5TVFLEK5vn8/up79HbFTC67TgeCXkAV0vXWr+viZGOGf3act/iPWyOSmZI+4pSA/08+mGsM2bDmQ0VCR20hH58FWSd1xYuKZcUlxXHqxGvln9vbmROZ6fOdDVvQ/fIH+mfmaL9Dyx0YO8LTu2h7QDIS4fs85B6Es7sgNwU7QK3LIX2IxvhTjQlpZKVB84yqJ0LjlamICU7Vz2AFILeA57XylMo10Ql9BYgxNeBL7ec4lBCBsE+2tx0E70J7ezbcfjCYQ4lZBCflkdyVj7nMwtIyspnZ9YXpOi2YF7SmfkjXyC4Tcf/9N7DOrriaGnCz7viDBK6pbElvdx6sSFuA4+GPIq4WC3Pp2zbvDPbodNN13TfLV1kolZB47Nhn5FZmMmB5APsT97PwsQ/+NrRkh7eHXgz+HHaePa5/MYPRXnw5TCtjo9XeKNVwNx5KpXzmQU8O7qNdiDyG8LTjmJp50Dndjc2SkwtjRpDbwFCyje8MBx28bfpQGTiAW78ZAv3LtrN838c5vNNMayP/4sU3RZ89WNZc+vC/5zMQeul39TDg7VHznMhu8Dg3BCvIZzJOsOpjFMVB926gbGlGnaphV2Ju3Awc6C/R39G+43m6bCn+SlwOjti43jVbRgnClOZtONZ/k7YePkLGZvDTZ9rPfXVT9Z5nFmFWRXrDiqr8kB+xf6zmBvrGd7RRRse+udZwm0cCG3Tr2IoSbkmKqG3AI5Wpvg5WxqsGP332HlW7zaihDxmDbVl5YP92fnsMP78nx/C6TfC3MJYfusr2FuaXObKtTMl1IviUsnvewxL4A/yGgTAhrgNFQf1RuAdphL6FUgpiTwfSYhrSMVfN8WFsOZZzBwCGDf8HX4Z84s293/T47y4/UXD4mhVuXeDgY9rZRiO/llncSbnJjPsl2Hcvvp2otOitYOlpbD1A3i9DXx7A+z7kcLcLFYfOseIIFcsdKXw2z0kmFlwhiJ6t+ldZ/G0diqhtxChPg5Enk4ju6CYp387yIzvIrE38gOgZ2AOnT1sMTct4vHNj2JjYsObA99Er9PXyXsHulrT09uOpZFxBtMk3Szd6OjQkY1xGw1f4NMXzh+GXMOZOUqFhOwEzuWcI9QttOJg5NeQEg3XvwZ6Y7ysvfhu1HfM7DKT36N+Z8rKKZdfezDgUW3jkZWPQE5KncT5R8wf5BXncTrzNJNXTuazne9SuHiSVuTNuzdkJcLy+9C9356nCudxu8c5rY7Quf1E9LodgD7ufeokFkUl9BYjxNee9Nwihr23kZ92nWH2ID9WzJqIic6kfD76C9teICE7gXcHvYuTuVOdvv+UUC+ik7KrzYcf4j2E/cn7uZB3oeKgTz9AQlzVrWmVi9ad0v6CWR1pwTO/H+TXrQco+fd1Sv2GasXTyhjrjHmo50N8dd1X5BbnMm3VtPKx92r0xlqdnrx0WPXoNccopeT3qN8Jdg1mxfgVXO8czOdHF3Jz/hH2DXkMpv0GD+6Gu/4m0nIQY412EPrvLbD1fehxO+EyDxdzF9ratr3mWBSNSugtRFhbR4QAY72On2b25ulRHbEyNaO9Q3sOpxzmhyM/sO7MOh4JfoSernVfY/rGrm2wNNGztMqc9CFeQ5BItsRvqTjYpifoTeH0tjqPo7kqLZXsi0vnvTXHueGjLby54S9Kiy05EWfBn/vPkvn3q1CQxejjI7nx0608t/wg5zPzy1/fy70Xy8Ysw8PKg0c3Pcq57EtsGObaSSt8dfh3OFTTbpK1F3k+kjNZZ5jgfxMOkd/zZsRvzMvWkWPjxh2xv/DGzjcpLC0iz70XM9Lu5K1OK2DcZ9BrFqXXv05EYgS92/SuGFJSrplK6C2Et6MFf8zpx+qHBxDm51h+PMgxiP1J+/lg9wcM8x7GHUF31Mv7W5oacWPXNqw8cI7sgorFRO3t2+Nu6c6/cf9WNDY207YVi1UJ/aI7vtnJ+HnbmLchGktTPfaOcfTz6MX2p4ax/z4fphuvI85vCgP7D8TO3IRfIuOZ8sUOzmVUlE62N7Pn46EfU1hSyMMbHia/OL/mN+s3V5uX/tejkJ1Uc5ta+D3qd6yMLRmxczGsexE63sjAuzezfMJfTO0wlR+P/cgHuz9g3dHz5BaWcH3PAOhxG9zwDlG550jNT6W3uxo/r0sqobcgXT3tsDYzNjjWybEThaWFuFu583/9/q9ee0M3h3qRW1jCyv0Vq1OFEAz2Gkz42XDyiivVbffpC+f2Q0FWDVdqXc6k5LI1+gLT+/qy5/kRfHCbN9klyQzx7YMQAt265xEmVvhOeo2nR3Vk0T1h/DizNxeyC5m6IJyzlerht7Vty5sD3uRY6jFe3vFyzaUf9EYwfj4U5sCfD9d696qE9DxOp+QgpSSzMJO1p9dyQ6kZ5lH/wMi3YPJCMLPF0tiSZ8Ke4ZYOt7Do6CJ+2LcWF2tTwtpWdDTCz4UDEOYedm3/eIoBldBbuH4e/Qh2DeaDwR9gbWJdr+/V09uOQBcrlkYaDrsM9hpMfkk+4WfDKw769AVZAnE76zWm5mDjCa2XfGdfX+wsTNiVuAuAUNdQbWOQqDUw6HGwrHjuEexjz/d39yK1LKlX3uRkkNcg5nSfw8qTK/nhyA81v6lLB61g2vFVWu/6CjLyihj14WYGvbORbi+vYfL388gvyWfCmcOk9nsRet8LVToLjwQ/gre1L0eKvuS6zjYGK4l3nNuBv62/4b63yjVTCb2Fc7Fw4buR39HeoX29v5cQgimhXuw9k07U+Yqed6hrKFbGVmyM31jR2LMXCL2avghsOJaEr6MFbZ0sAW1s2t7UHn+btvDPc+DgB71mV3tdT297frgnjLTcQqYu2EF8WsW0xZldZzLcezjv7X6PHWd31PzGYbMhdCZs/xh2Xn6LwB92xJKZX8zj17dndNc2FPMn7QsK2ZE7lJ7r2/P4L/spKjHs6ZsbmTPCaS4YZZFkuqT8eGFJIXvO71HTFevBFRO6EOIbIUSSEOLQJc4PFkJkCCH2lX2oggyt2E09PDDWC4OHo8Z6Y/p79Gdj3MaKBSimVtCme6tP6PlFJWyPSWFwpVW2uxJ3EeIWgji5AZKPwpBnwajm9QLdvexYdHcY6blFTF0QTlyqltR1Qsdr/V/Dz9aPxzc/TlxWXPUXCwGj3tI2Y179hLb9YA1yC4v5euspBrd3Zs6QAO702ESScRbjLf3ofe98Zg3045fd8dyzMJKcSs9PACJPWGGRM4od59ex6uQqAPYn7yevOE+Nn9eD2vTQvwOuVABii5Sye9nHK9celtJcOVqZMryjK7/tTaCwuKLHNsRrCKn5qRxIPlDR2KcvJERqhaZaqfCTKRQUlzKkg5bQDeaf7/5W26y749jLXqOblx2L7wkjM09L6mk5hYC2YfjHQz6mVJYyd8Ncw8qXF+n0MOlrcO8Oy2ZAwu5qTZbsjCMtt4gHhgTAqc38tvN9TCSMGfcdnT3teeaGjrwxoQtbopK55cvw8hXDSVn5bI+5wCT/O+jq3JVXI14lMSeR8HPh6IWeENeQa/vHU6q5YkKXUm4G1AoQpdamhHqRmlPIuqMVe5r28+iHkTAyXGTk0w9KCmtMIq3FxuPJmBnrCGur1VcpHz+38tV6zD1uu2TvvLKunnYsnNGLsxl5fLnlZPlxLxsvXuj9AifSTrAp/hJli00s4dalYOkMP06BtNjyUwXFJSzYHENYWwdCzM9R8NNt/GVtyTDvYdhaVRRXu6WXNwtuD+HE+Swmfr6d2As5rDpwjlIJ43t48Ub/NyguLea5rc+x4+wOujh1uWJFT+Xq1dUYeh8hxH4hxGohRKdLNRJCzBJCRAohIpOTk+vorZWmZkCgMzZmRmyNrlhMZGtqS7BrsGEZAO/egGi1wy5SSv49lkRffyfMjLVVu7sSd2nj59FbtIfGPe+s9fV6eNszuos7322PJaVSXZ3hPsNxs3RjybEll36xlQtM+xVKi2HRJEg8BMf+4tjSF3g+7x2+zZkD8wew3sqKTAETOk6tdonhQa78OLM3mXlFTPx8O9+Hn6aDmzXtXK3xtvHmidAniEiM4OCFg2r8vJ7URULfA/hIKbsBnwDLL9VQSrlAShkipQxxdnaug7dWmiK9ThDoak10UrbB8SHeQziZcZLTmWX7kZrbawtdWukCo1MXcjiTmsuQ9hX/L0QmRhLiGozY+z34DQZH/6u65tzhgeQVlbCgUi/dSGfElPZTiDgXQUx6zKVf7BQIU3/UNvSe3w9+upVuUZ8SYnwKc/d20P8RfvPriYeVB73cetV4iZ7e9iy7ry/mJnpOJucwplub8nMTAycyyFOr7xPmpqYr1odrTuhSykwpZXbZ16sAYyFE3a4rV5qdAGcrYqok9P4e/QHYmVhpqqJPX23qYkkRrc2G49pfqRcfiCZkJ3A25ywhemvIiIPg6Vd9zQAXa8Z2a8P3208bVL+cEDgBE53J5XvpoP33mPE3jPmYjQN+pFP+1xyYuBlxy0/E9ZpOxIUDjA8Yj05cOnX4O1vx2/19eXBoANPCfMqPCyF4rf9rvNDnhXpZrazUQUIXQriJstUqQoheZdesm8o/SrMV4GJFSk5h+QM6AE8rT4x0RsRnxVc09OkLRTlw7kANV2nZNh5Pwt/ZEi8HC6DS+HncIW08u/3o/3Tdh4YFlo19V/TSHcwcGNl2JCtiVpBVeIXFXB7BlPa4g9f2W+Hp6sLwjtpY+fLo5QgE4wPGXzEGF2szHr2uPbYWhgvdbE1tmdxu8mV/ISj/XW2mLS4BdgDthRDxQoi7hRD3CiHuLWsyCTgkhNgPfAxMlbXdmVhpsQJctAdeMckVvXS9Tk8byzYkZFcqs+tdtuFFKxt2yS0sJuJkqsGmILsSd2FvYot/9EboMa1WD0Nr4u9sxbjuHny/I5bkrIpe+q0dbiWvOI8VMSuueI01RxKJSsrm/iH+6HSCzMJMfov6jb4efXGzdPtPcSn1rzazXG6RUrpLKY2llJ5Syq+llPOllPPLzn8qpewkpewmpewtpWydT7gUA/7OWkKvOo7uae1p2EO3dgXHgFb3YHR7dAqFJRXTFaFs/NzIFp0sgZ7XVnPnwaEBFBaX8sWmijHzTk6d6OrUlZ+O/VTzhhRlpJR8uiEaX0cLbuyqjYG/vfNtUvNTmdNtzjXFpdQv9XePUi887M0xNdJVS+geVh6GPXTQhl3ObK91TZGWYMPxJCxN9IT4artNlY+fJ8eC3xBtdeg18HO2YnwPD34IP01SpaqMUztMJTYztryWSk02nUjmUEIm9w32R68TbIrbxB8xf3B357vp4tzlmuJS6pdK6Eq90OsEfs5WRCdX76GnF6QbjuP69IP8DEg63MBRNg4pJRuPJ9M3wKl8U++L4+chaech5K46eZ+HhgZSXCr5vFIv/Xrf63Ewc7jkw9Gz6Xm8svIIbWzNuKmHJ+n56by04yUC7QO5t9u9Nb5GaTpUQlfqTYCLVfUhFytPAMNeuq82+4VTmxsqtEYVnZRNQnqewfh5ZGIkdugJMLGH9jfUyfv4OlkyoYcHiyPOlNdON9GbMDFwIpviNhkOfQHHE7OY8Nl2kjMLeH9Kd0yMdLy+83XS89N5vf/rmOivfbtCpX6phK7UmwBnKxLS88grLCk/5mHtAUBCVqWEbuupjaOf3NjAETaODce16oqDy+afF5UUsSNhKyE5Weh6TNN2FqojDw4NpLRU8vnGil76ze1vRid0/Hz85/Jj4SdTmDR/O6VSsnR2H3r7ObL29FpWn1rNrG6z6ODQoc5iUupPk9pqu6ioiPj4ePLzW29tj4ZgZmaGp6cnxsZ1lzhqEuBihZTaTJfOHrZARQ89Ptuwd4jfYNi3RJuPXocJrSnacCyZDm7WtLEzB2DlyZUk5acwISsbgmu/MrQ2vB0tmBTsyXfbYzlxPotbenlzXSdXhnoP5deoX7mv+338eySdR5buw9vRgu/uCsXT3oKUvBT+b8f/EeQYxD1d7qnTmJT606QSenx8PNbW1vj6+qptqeqJlJKUlBTi4+Np27Z+93KsPHXxYkK3NbXF2sS62p/7tB0Eu76C+EjwabmbBmflF7ErNpV7BmgPPYtLi/nywBcEFZXS370P2PvW+Xs+f2MQHnbm/LQrjgeX7MXB0oQBXfqSWbiW59b+wG+bPQj2tuerO0OwszBBSsmr4a+SXZTNa/1ew1jXsn/BtiRNKqHn5+erZF7PhBA4OjrSELV0fJ0s0Ikapi5aeVbvobcdAAg4talFJ/Rt0SkUl8ry4Za/Y/8mLjuBD1NTEbc+Xy/vaWlqxIPDApkzJIAt0Rf4aecZ/tpZiImPK/+c+wLXDm44uHvxzp6/cDRzpKCkgHVn1jG351wC7APqJSalfjSphA6oZN4AGurf2NRIj4+jZY1z0aPSogwbm9tr9dFPbtQ2MW6h/j12HmtTI4J97CmVpXy55xMCCgsZ0mkaeAbX63vrdIJB7ZwZ1M6Z5KwCPtkGh7PW4GpfTGp+CqcyY0jJS6GotIgwtzCmd5per/Eoda/JJXSlZfF3rj7TxcPKg01xmyiVpYZLwP0Gw/ZPoCBb2wCjhYlLzWX5vrOM69YGY72ONSdXczLnLO/k69ANq5/e+aU4W5vyysjRgGF5ASkl2UXZWBlbqc5VM6RmuVyDY8eO0adPH0xNTXn33XcNzv3999+0b9+egIAA3nzzzUaKsPEFuFgRm5JDcaXtyTytPCksLSQ5t8qwT9tBWvnWFrpq9O1/jqMT8MiIdkgpWRDxFr6FRYwY+gaY2TR2eID215u1ibVK5s2USujXwMHBgY8//pjHHnvM4HhJSQlz5sxh9erVHDlyhCVLlnDkyJFGirJxBbhYUVQiOZ1asd+lp3UNc9FBq4+uN22R0xf3nEnjz/1nmTnAjzZ25mw+/ivHC1OYae6LPmhcY4entBBNdsjl5T8Pc+RsZp1eM6iNDS+OueT+G+X+7//+j0WLFuHs7IyXlxfBwcGYmJgwf/58jIyMCAoK4qeffsLFxQUXFxf++usvg9fv3LmTgIAA/Py0mQxTp07ljz/+ICgoqE7vpzm4ONMlOim7vL6Lh5U2Fz0+O96wjKqxuZbUT11iZ51mSkrJqyuP4Gxtyr2D/JGlpXyx8208iksYNeZzbW9PRakDTTahN5Zdu3bx66+/sn//foqKiujZsyfBwcG8+eabnDp1ClNTU9LT0y97jYSEBLy8vMq/9/T0JCIiop4jb5r8nbWd7KOTsrm+7HdpG6s2CET1qYsAfoNg/SuQnQxWLWMTlFUHE9lzJp23JnbB0tSI7eHvc1Dm8UKbwRg71O/UUaV1abIJvTY96fqwbds2xo0bh5mZGWZmZowZMwaArl27cttttzF+/HjGjx/fKLE1R9ZmxrjZmBlsdmGiN8HV0rX6kAtoD0bXv6L10rtMarhA60lBcQlv/n2UDm7WTAr2gvxMFhz6Ble9jnHD3r3yBRTlKqgx9Fr666+/mDNnDnv27CE0NJTi4hp2UC/j4eFBXFxc+ffx8fF4eHg0RJhNUoBL9SJdHlYeNffQ3buDmW2LGUdfuD2WuNQ8nhsdhF4niFz1ILuNBXd1uBUTE4vGDk9pYVRCr6Jfv378+eef5Ofnk52dzcqVKyktLSUuLo4hQ4bw1ltvkZGRQXZ29iWvERoaSlRUFKdOnaKwsJCffvqJsWPHNuBdNC0BLtp2dJX3PfG08qw5oev04DsATm6CZr5PSmpOIZ/8G82Q9s70D3RCbp/H50nbcdSZMjF0bmOHp7RATXbIpbGEhoYyduxYunbtiqurK126dMHe3p5p06aRkZGBlJKHHnoIOzs7EhMTCQkJITMzE51Ox4cffsiRI0ewsbHh008/5frrr6ekpIQZM2bQqVPjDCE1Bf4uVuQUlnAuI7+8fomHtQdJeUkUlBRgqjc1fIHfYDi2EtJOXXNd8Mb00boT5BaW8MwNHeHIH2za8n/sdHPm6eBHMDMya+zwlBZIJfQaPPbYY7z00kvk5uYycOBAgoODmTlzZrV2bm5uxMfX0MsEbrjhBm64oW7KoDZ3AZV2L7qY0CuX0fWzrZK0/QZrn09ubLYJPTopm0URZ7illxeBBYcp+nUm73m1wdfGk8kdbm7s8JQWSg251GDWrFl0796dnj17MnHiRHr2VDuUX4vKUxcv8rLWZgEZlNG9yDEArNtowy7NUGmp5MUVh7Aw1vNoTx0smcovzm2IFSU8FvK4Knal1BvVQ6/Bjz/+2NghtChOVibYmhsbPBitPBe9GiG0XvqJv7Vt6XTNq9+xeOcZtkWn8MFod+x/u4UMvRGf21gQ5hTEQM+BjR2e0oJd8f8UIcQ3QogkIcShS5wXQoiPhRDRQogDQgjVnVUMCCGq7V7kZO6Eqd605gejoCX0vFQ4f7BhgqwjZ1JyeWPVUYb7WzL+6P8gJ5kvg28ioyibx0MeV0vqlXpVm67Pd8DIy5wfBQSWfcwCPr/2sJSWJsDZymAuuhCi5g2jL2pb1pNtRtMXS0sljy/bT3sRx2dFzyPO7SfuxndYHL+O8QHjae/QvrFDVFq4KyZ0KeVmIPUyTcYB30tNOGAnhHCvqwCVliHAxYqUnELScgrLj3laX2LqIoCNOzh3aFYJ/Ydt0QSf+ZZl+qcxyT4LUxbxQdoejHXGPNDjgcYOT2kF6mJw0gOIq/R9fNmxaoQQs4QQkUKIyIbYYEFpOsofjFYaR/e08iQhO8FgfrqBtoPg9A7IudAQIV6T+BP76LFuCk8YL0XX4QaYE8Eee3fWnl7LjM4zcLFwufJFFOUaNejTJinlAilliJQyxNm5ZdTpuJyNGzdy4403NnYYTUJNM108rDzILsomoyCj5hf1uE37/P14yEur5wj/o9ISSrd+hMuPw/ESSaTfsABx8/eUWjjwzq53cLFw4c5OdbtPqKJcSl0k9ATAq9L3nmXHWqySkpIrN1IMeNiZY2asM0joF8vo1jjTBcC9G0xdBBeOw6JJUJDVEKHWXmEuLJ2Gbt0LbCjpxvbrVmLXawoZBRl8uvdTDqUc4uGeD2NuZN7YkSqtRF1MW1wBPCCE+AkIAzKklOeu+aqrn4LEOp7h4NYFRl1+s4nY2FhGjhxJcHAwe/bsoVOnTnz//fcEBQUxZcoU1q5dyxNPPIGDgwMvvvgiBQUF+Pv78+2332JlZcXff//N3LlzsbCwoH///uXX3bRpEw8//DCgPRDcvHkz1tbWdXt/TZhOJ/BzsrpkQu/s1LnmFwYMh8nfwdLb4cepcNsv0BRqoOSmwpKpyLidvFoynVj/W7nHN48nNj3B+jPrKSwtZJDnIG70U3+hKQ2nNtMWlwA7gPZCiHghxN1CiHuFEPeWNVkFnASigS+B++st2gZy/Phx7r//fo4ePYqNjQ2fffYZAI6OjuzZs4fhw4fz6quvsm7dOvbs2UNISAjvv/8++fn5zJw5kz///JPdu3eTmJhYfs13332XefPmsW/fPrZs2YK5eevrtVWdunhxteglH4xe1GE0TFgAp7fBz7dDcUF9hnllGfGUfD2S4vg9zC6ZzW/OZsRZvsCstbPYdnYbk9pNYtmYZXw67FPDLfYUpZ5dsYcupbzlCuclMKfOIrroCj3p+uTl5UW/fv0AmDZtGh9//DEAU6ZMASA8PJwjR46UtyksLKRPnz4cO3aMtm3bEhgYWP7aBQsWAFrRr//973/cdtttTJgwAU9Pz4a+rUYX4GLFiv1nyS0sxsLECAtjCxzMHC49dbGyLpOgKBdWPAjLZsDkhaBv+HVxJYlHyP9uPKX5mdymv5PEwAiKZQreNmHMDX6YYT7DqtemUZQGolaK1qDq4o+L31taaps1SCkZMWIES5YsMWi3b9++S17zqaeeYvTo0axatYp+/frxzz//0KFDh7oNvIm7+GD0ZHIOnT1sgcuU0a1JzzugKA9WPwHLpsPo98Gq4WaPREWuxe2v6WSVGnGfx1hiTdfibe3NmwM+vfSQkaI0IPX3YA3OnDnDjh07AK0MQOWxcIDevXuzbds2oqOjAcjJyeHEiRN06NCB2NhYYmJiAAwSfkxMDF26dOHJJ58kNDSUY8eONdDdNB2BZQl9f3x6+bFLltG9lLDZcN2rcHw1fNwDNr2jPZysR6WZiUR8+TBef97CIb0N93TsxknTHdwUeBM/3/izSuZKk6ESeg3at2/PvHnz6NixI2lpadx3330G552dnfnuu++45ZZb6Nq1a/lwi5mZGQsWLGD06NH07NkTF5eK3uOHH35I586d6dq1K8bGxowaNaqhb6vRBbhY0cHNmm+3xVJaqs0997T2JDEnkeLSS28YUk3fB+H+CK08wIZX4ZOesHcRlNbx7KOUGAp+f5CS9zsTEr+QBS5dedjXigyZwvuD3+flvi9jYdwEHtAqShk15FIDIyMjFi1aZHAsNjbW4PuhQ4eya9euaq8dOXJkjb3vTz75pE5jbI6EEMwZEsCDS/byz+FERnVxx8PKg2JZzPnc8+UFu2rFKQCmLtYWHq15Fv6YA+Gfw9DnIfC6ayvolbAbtn6IPPonYMSykoGE92zPv5krCXUO5fX+r+Nm6fbfr68o9UT10JUGdUMXd9o6WfLphmiklOVTF2sso1sbPn3gnvUw6VttnvqSKTAvFCIWQMGld5WqRkqI2QALx8CXQymK3sCC0nGMM/qcszeM5d/MlYz1H8uXI75UyVxpslRCr8LX15dDh2osLKnUAb1OcN8gfw6fzWTjieQrLy6qDSGg8wR4cDdM/Frbk3T14/B+R/jnWUiLvfRrS0vg8HJYMBh+GI9MPsG/Xg/QI+sD1rjPZuZES76P+oCBngN5qe9L6HX6/x6notQzNeSiNLjxPTz4cN0J5v0bzZJZoeiF/uoejNYgoyCDj/Z8hLmROY/dsx4RHwkRn0PEfAj/DBwDwdIJLBzAwhHMHcDYHA4shZRocPBHjvmYV+O68nX4Wab19mZ0aB4P/Ps8nZ068+6gd9XGFEqTpxK60uBMjHTMHuTPiysOs/t0Ju6W7tfUQ98cv5mXt79MUl4SAEGOQYz2Gw1eoZCRALu/g+SjkJsGF6IhN0KrtV5aDG5dtZWoHcfy6YaTfB1+grv7t2VyHx13/TMLT2tP5g2dp5bvK82CSuhKo5gS6sUn/0Yzb0M0Hl4e/2kMPaswi7d3vc3y6OUE2AXw4ZAPeXvX27wW8RrBrsHaWLetBwx9tvqLpYTCHDCxBCFYFH6a99aeYEIPD+4cYM2d/9yBpbElX4z4Ajszu2u/YUVpAGoMXWkUZsZ67hnQli1RF7AQLrXuoZ/PzOeRpfsYteBLxi2/iRUxK7inyz0svXEpXZy78Fr/1yguLeaFbS9cuiwvaOPuplYgBH8dOMfzfxxiaAcXbh5QxL3rZ1NYUsgXI75QD0CVZkUldKXRTOvto+01etaU1PxUcosuvUCosLiULzbFMPTdjfwdt4R4049JzxF8OXwhD/d8GBO9CQDeNt48FvIYO87t4KfjP10xhq1RF5i7dC+dfLIxbvM1M9fOoKC4gHnD5uFv519n96ooDUEl9Cr0ej3du3enc+fOjBkzhvT0dECbhy6EMJhP/sADD/Ddd98BMH36dDw8PCgo0ApHXbhwAV9f3waL+7vvvuOBB5rXrjhWpkZM7+vLiXjtYWNUelSN7bZGXWDUR5t5Y/UxOvunYuL8N93sB5IeNYdPVhdQWFxq0H5yu8n08+jH+5HvE5sRe8n3PxCfzuwlf2Pv+zOnzV/lUMpB/hf8P/6a8BfdXbrX1W0qSoNpsmPob+18i2Opdbs8voNDB57s9eRl25ibm5fXZLnzzjuZN28ezz6rjcG6uLjw0UcfMXv2bExMTKq9Vq/X880331RbWXotSkpK0Otb7lS5u/r58tX2AIyx4rmtzzFv8LfkFZiSlJXP+cwC1h89z+pDifg4WvDptPZ8fOx+PHQefDHqbf5qk8oTyw7w6C/7+WhKd3Q6reaOEIJX+r7ChBUTeGbrM3w/6nuMdNqP+vnMfP49lsSKo7s4kLEKnXck0siEmUEzmd55OjYmNo35z6Eo16TJJvSmoE+fPhw4cKD8e2dnZ/r168fChQuZOXNmtfZz587lgw8+qPFcVRs3buSFF17A2tqa6OhohgwZwmeffYZOp8PKyorZs2ezbt065s2bR2xsLB9//DGFhYWEhYXx2Wefodfr+fbbb3njjTews7OjW7dumJpqVf5++eUXXn75ZfR6Pba2tmzevLnu/lHqmJ2FCdNCu/DVrtso9PmK65fMJO/MXYD2S8zMWMejI9pxz4C2PLv9CZJzk/nhhh+wNLbk5hBLUnMKeXP1MewtjHl5bKfyQmouFi481/s5Ht/0OK9tm4dN/ijWHTvNiZzNGNvtQm+egJGtMaN8buLRXnNwtmj5O2gpLV+TTehX6knXt5KSEtavX8/dd99tcPzJJ59k1KhRzJgxo9prvL296d+/Pz/88ANjxoy54nvs3LmTI0eO4OPjw8iRI/ntt9+YNGkSOTk5hIWF8d5773H06FHeeusttm3bhrGxMffffz+LFy9mxIgRvPjii+zevRtbW1uGDBlCjx49AHjllVf4559/8PDwKB8yasruHeRPbmEJiaV6wsVnDOu/jVlBT+BqY4abrRlmxnqWnVjG2tNreST4EYNiWPcO8ic1p5AFm0/iYGnC3OHtyCkoZmv0BTYcbYMutye/xHxDSdZOjK2PYmZThI9VALcGPc1ov9HYmto24p0rSt1qsgm9seTl5dG9e3cSEhLo2LEjI0aMMDjv5+dHWFgYP/74Y42vf/rppxk3bhyjR4++4nv16tULPz8/AG655Ra2bt3KpEmT0Ov1TJw4EYD169eze/duQkNDy+NzcXEhIiKCwYMHc3Fv1ilTpnDixAlAq70+ffp0br75ZiZMmPDf/iEakL2lCf83vjPQmQ93F/D1oa8Zkt+FML9pAJxMP8lbO9+it3tvpneaXu31T4/qQGpOIR+ui2JL1AUOxmdQWFKKtakRfdrdzRHxEkUOMYz2G8/EwIkEOQZVK5GsKC2BSuhVXBxDz83N5frrr2fevHk89NBDBm2eeeYZJk2axKBBg6q9PjAwkO7du/Pzzz9f8b0uVXfdzMysfNxcSsmdd97JG2+8YdB2+fLll7zu/PnziYiI4K+//iI4OJjdu3fj6Oh4xXiagod6PkRsZizvRL6Dt403Ye5hPL75ccyNzHm9/+s17gAkhODNCV0oKC7lyNkM7ujjw9COLoT6OmCs15FduAK9Tq8WByktnprlcgkWFhZ8/PHHvPfeexQXG5Z27dChA0FBQfz55581vvbZZ5/l3XffveJ77Ny5k1OnTlFaWsrSpUur1V0HGDZsGMuWLSMpSVsFmZqayunTpwkLC2PTpk2kpKRQVFTEL7/8Uv6amJgYwsLCeOWVV3B2diYuLu5qbr1R6YSO1/u/Tnv79jy+6XGe3vI0J9JO8Gr/Vy87zm2k1/HJLT1Y/+hgnrsxiL7+ThjrtR9vKxMrlcyVVkEl9Mvo0aMHXbt2rbYzEWhJOz6+5sUwnTp1omfPnle8fmhoKA888AAdO3akbdu23HTTTdXaBAUF8eqrr3LdddfRtWtXRowYwblz53B3d+ell16iT58+9OvXj44dO5a/5vHHH6dLly507tyZvn370q1bt6u468ZnYWzBJ0M/wcrYirWn1zKt4zQGeg5s7LAUpckTl11NV49CQkJkZGSkwbGjR48aJKaWbOPGjbz77rusXLmyUd6/Ofxbn0g7waqTq7i/+/3lC4cUpbUTQuyWUobUdK5WPXQhxEghxHEhRLQQ4qkazk8XQiQLIfaVfdxzrUErSjv7dswNnquSuaLU0hUfigoh9MA8YAQQD+wSQqyQUh6p0nSplLJ5LVVsAAcPHuT22283OGZqalo+S0VRFKWu1GaWSy8gWkp5EkAI8RMwDqia0OuElLJFTSnr0qVL+crTpqKxhtkURalftRly8QAqT5OILztW1UQhxAEhxDIhhFdNFxJCzBJCRAohIpOTk6udNzMzIyUlRSWceiSlJCUlBTMzs8YORVGUOlZX89D/BJZIKQuEELOBhcDQqo2klAuABaA9FK163tPTk/j4eGpK9krdMTMzw9PTs7HDUBSljtUmoScAlXvcnmXHykkpUyp9+xXw9n8JxtjYmLZt2/6XlyqKorR6tRly2QUECiHaCiFMgKnAisoNhBDulb4dCxytuxAVRVGU2rhiD11KWSyEeAD4B60E3jdSysNCiFeASCnlCuAhIcRYoBhIBabXY8yKoihKDZrUwiJFURTl8i63sKjREroQIhk4XYumTsCFeg6nKWgt9wmt515by31C67nXpnCfPlLKGgsbNVpCry0hROSlfhu1JK3lPqH13GtruU9oPffa1O9TFedSFEVpIVRCVxRFaSGaQ0Jf0NgBNJDWcp/Qeu61tdwntJ57bdL32eTH0BVFUZTaaQ49dEVRFKUWVEJXFEVpIZpsQr/SphrNmRDiGyFEkhDiUKVjDkKItUKIqLLP9o0ZY10QQngJITYIIY4IIQ4LIR4uO94S79VMCLFTCLG/7F5fLjveVggRUfZzvLSsfEazJ4TQCyH2CiFWln3fUu8zVghxsGzjnsiyY03257dJJvRKm2qMAoKAW4QQQY0bVZ36DhhZ5dhTwHopZSCwvuz75q4YeFRKGQT0BuaU/XdsifdaAAyVUnYDugMjhRC9gbeAD6SUAUAacHfjhVinHsawZlNLvU+AIVLK7pXmnzfZn98mmdCptKmGlLIQuLipRosgpdyMVvOmsnFoZYcp+zy+IWOqD1LKc1LKPWVfZ6ElAA9a5r1KKWV22bfGZR8SrYz0srLjLeJehRCewGi0yqoIbUeaFnefl9Fkf36bakKv7aYaLYmrlPJc2deJgGtjBlPXhBC+QA8gghZ6r2XDEPuAJGAtEAOkSymLy5q0lJ/jD4EngNKy7x1pmfcJ2i/lNUKI3UKIWWXHmuzPb11tcKHUISmlFEK0mPmkQggr4FdgrpQys/IWgy3pXqWUJUB3IYQd8DvQoXEjqntCiBuBJCnlbiHE4EYOpyH0l1ImCCFcgLVCiGOVTza1n9+m2kO/4qYaLdD5i3Xlyz4nNXI8dUIIYYyWzBdLKX8rO9wi7/UiKWU6sAHoA9gJIS52nFrCz3E/YKwQIhZtKHQo8BEt7z4BkFImlH1OQvsl3Ysm/PPbVBP6FTfVaIFWAHeWfX0n8EcjxlInysZWvwaOSinfr3SqJd6rc1nPHCGEOTAC7ZnBBmBSWbNmf69SyqellJ5SSl+0/y//lVLeRgu7TwAhhKUQwvri18B1wCGa8M9vk10pKoS4AW2s7uKmGq81bkR1RwixBBiMVorzPPAisBz4GfBGKyt8s5Sy6oPTZkUI0R/YAhykYrz1GbRx9JZ2r13RHpDp0TpKP0spXxFC+KH1ZB2AvcA0KWVB40Vad8qGXB6TUt7YEu+z7J5+L/vWCPhRSvmaEMKRJvrz22QTuqIoinJ1muqQi6IoinKVVEJXFEVpIVRCVxRFaSFUQlcURWkhVEJXFEVpIVRCVxRFaSFUQlcURWkh/h8JQDCvRuvZFQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "rnn_preds,_ = model(X_feature.unsqueeze(2))\n",
    "preds.squeeze()\n",
    "time = torch.arange(1, num+1, dtype= torch.float32)  # 时间轴\n",
    "\n",
    "plt.plot(time[:num-seq_len], gs10['GS10'].to_list()[seq_len:num], label='gs10')\n",
    "plt.plot(time[:num-seq_len], preds.detach().numpy(), label='preds')\n",
    "plt.plot(time[:num-seq_len], rnn_preds[:,seq_len-1].detach().numpy(), label='RNN_preds')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c93a2021",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([2.8600, 2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500,\n",
       "        3.1200, 2.8300, 2.7100, 2.6800, 2.5700, 2.5300, 2.4000, 2.0700, 2.0600,\n",
       "        1.6300, 1.7000, 1.7100, 1.8100, 1.8600, 1.7600, 1.5000, 0.8700, 0.6600,\n",
       "        0.6700, 0.7300, 0.6200, 0.6500, 0.6800, 0.7900, 0.8700, 0.9300, 1.0800,\n",
       "        1.2600, 1.6100, 1.6400, 1.6200, 1.5200, 1.3200, 1.2800, 1.3700, 1.5800,\n",
       "        1.5600, 1.4700, 1.7600, 1.9300, 2.1300, 2.7500, 2.9000, 3.1400, 2.9000,\n",
       "        2.9000, 3.5200, 3.9800, 3.8900, 3.6200])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aefeeb54",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
